Avatar billede poull Nybegynder
26. juni 2003 - 12:01 Der er 16 kommentarer og
1 løsning

jpeg komprimering uden at gemme

Jeg ønsker kunne komprimere et jpeg billede udne at skulle gemme det. Altså nøjes med at have billedet i en variabel og så løbende kunne justere komprimeringsgraden. Jeg kunne forestille mig at det skulle gøres noget i den her stil:

  JpegImage := TJpegImage.Create;
  JpegImage.CompressionQuality := 60;
  JpegImage.Assign(OriginalBitmap);
  Image.Picture.Bitmap.Assign(JpegImage);

Denne kode har et originalen i en bitmap kaldet OriginalBitmap. Image er en image komponent. Ovenstående kode udfører ikke noget fejl, men komprimere blot ikke billedet. Hvis jeg der i mod gemme jpeg billedet og loader det ind i imagen, så virker det.

Nogen der kan hjælpe?
Avatar billede razersedge Nybegynder
26. juni 2003 - 12:07 #1
Du skal huske at bruge JpegImage.Compress; efter du har sat kvaliteten.
Avatar billede razersedge Nybegynder
26. juni 2003 - 12:09 #2
Hov, det skal vel være efter du assigner JpegImage :)
Avatar billede dkn Nybegynder
26. juni 2003 - 14:49 #3
JpegImage := TJpegImage.Create;
  JpegImage.Assign(OriginalBitmap);
  JpegImage.CompressionQuality := 60;
  JpegImage.Compress;
  Image.Picture.Bitmap.Assign(JpegImage);
Avatar billede razersedge Nybegynder
26. juni 2003 - 15:02 #4
Som jeg sagde..?
Avatar billede poull Nybegynder
26. juni 2003 - 20:40 #5
Den kode som razersedge forklarer sig frem til, og som dkn skrev virker fint ifølge hjælpefilen, men den virker bare ikke i praksis. Det med compress havde jeg også prøvet. Prøv selv at teste om i kan få det til at virke og meld tilbage :)

Af hvad jeg har kunnet læse lidt om på nettet er der måske rent faktisk en fejl i jpeg-unitet :/
Avatar billede razersedge Nybegynder
26. juni 2003 - 23:32 #6
Jeg har brugt kode meget tilsvarende til det du viser der med fine resultater.

Ved ikke om det skulle gøre en forskel, men har du prøvet at loade et billede ind via JpegImage?

Jeg loadede billederne ind via JpegImage, Assignede det over i en TBitmap, lavede min manipulering i TBitmap'en, brugte så JpegImage's assign på Bitmappen, indstille compression, brugte Compress og gemte til en fil.

Hvilken Delphi version har du? Jeg brugte Delphi 6.
Avatar billede poull Nybegynder
26. juni 2003 - 23:35 #7
razersedge >> Det du skriver der virker også fint ved mig, men den store forskel er at du gemmer billedet til sidst. Jeg kan fint få komprimeringen til at virke hvis jeg gemmer billedet, men jeg kan ikke få den til at virke hvis jeg blot tegner det komprimerede billede på en bitmap.

Jeg bruger delphi 7, men tror ikke jpeg uniten har ændret sig så meget.
Avatar billede razersedge Nybegynder
26. juni 2003 - 23:44 #8
Nej.. Virker lidt usandsynligt de skulle have ændret unit'en til det værre.

Hvad med at gemme billedet og så loade det igen? Nu har jeg ikke selv leget ret meget med clipboard, men kunne du ikke gemme det der?
Avatar billede poull Nybegynder
26. juni 2003 - 23:57 #9
Som det er nu laver jeg netop preview funktionen (for at man kan regulere komprimeringen optimalt) ved at gemme billedet men man kan godt mærke at jeg benytte disken til at gemme hver gang for der er lidt forsinkelse på. clipboarded er en måske en mulighed. Kigger jeg nok på i morgen :)
Avatar billede dkn Nybegynder
27. juni 2003 - 00:53 #10
hmm du har ret, det virker ikke og kommer nok heller ikke til det sådan udenvidere.

Der er jo desvære ikke soruce med til jpeg da det kræver en license det format.

Dvs det du vil er ikke muligt med timage ihvertefald, dette skyldes at under export af data fra jpeg bliver der skrevet header osv, man kan ikke engang loade den igennem en stream.

Jeg har ikke testet clipboard metoden, hvis den virker er den aligevel ikke hurtigere tror jeg ikke, og man skal egentlig heller ikke udsætte sine brugere for sådan en løsning.

Men hvis du står og skal udregne størrelse af fil kan det gøres på denne måde:

procedure TForm1.TrackBar1Change(Sender: TObject);
var
  JpegImage        : TJpegImage;
  ms                : Tmemorystream;
begin
  JpegImage := TJpegImage.Create;
  JpegImage.Assign(Image1.Picture);
  JpegImage.CompressionQuality := TrackBar1.Position;
  JpegImage.Compress;

  ms := Tmemorystream.Create;
  JpegImage.SaveToStream(ms);

  caption := inttostr(ms.Size) +' bytes';

  JpegImage.Free;
  ms.Free;
end;

desvære kan jeg ikke hjælpe med preview problemet.
Avatar billede poull Nybegynder
27. juni 2003 - 12:09 #11
Størrelsen er selvfølgelig en af de ting man kan optimere efter, men da billeder kan klare forskellige komprimeringsgrader alt efter deres indhold, så synes jeg næsten det er nødvendigt kunne se et preview.

Vil det være mest optimalt at gemme billedet til disken eller benytte clipboarded?

Er der mulighed for at finde en komponent eller unit (gratis) som også har jpeg funktioner og dermed undvære at bruge delphi egen?
Avatar billede razersedge Nybegynder
27. juni 2003 - 13:08 #12
Kommer egentligt til at tvivle på om det vil gøre nogen forskel at gemme til clipboard, men jeg tror ikke det kan være langsommere end at gemme til disken.
Avatar billede athlon-pascal Juniormester
27. juni 2003 - 15:29 #13
poull -> Måske, prøv Google: http://www.google.com/search?q=delphi+jpeg+image+component&ie=UTF-8&oe=UTF-8&hl=da&btnG=Google-s%C3%B8gning&lr=

Hvis du vælger clipboard-løsningen, og den virker, så husk først at kopiere indholdet af clpiboard (hvis der er noget) til en variabel, dernæst bruge clipboard til dit jpeg-billede, og så til sidst kopiere det oprindelige indhold  tilbage til clipboardet igen...
Avatar billede poull Nybegynder
27. juni 2003 - 16:37 #14
athlon-pascal >> Jeg har for et par uger søgt alt hver jeg kunne men hver gang jeg fandt frem til noget der syntes brugbar af beskrivelse, kostede det penge :/ Jeg prøver dog lige i løbet af dagen i dag at teste nogle af de ting som fremkom via dit link.

Men det kunne godt ske at der var nogle af jer som kendte til en god jpeg pakke :)
Avatar billede poull Nybegynder
30. juni 2003 - 20:15 #15
Jeg har kigget lidt på det men syntes ikke lige jeg kunne finde ud af at kopiere jpg'en til clipboarded. Og endda tage en backup af clipboarded inden da. Jeg har stort set ikke arbejdet med clipboarded før nemlig.

Som jeg tolker hjælpefilen, så skal man først kalde:
  JpegImage.SaveToClipboardFormat(AFormat, AData, APalette);

Og så modtager man i de tre variabler de oplysninger der skal til for at gemme det, men der står også at man skal kalde
  RegisterClipboardFormat

Men da den tilhører TGrahpic, kan jeg ikke lige se hvad man skal have en TGraphic for. Kort sagt: Jeg er lidt forvirret :)
Avatar billede poull Nybegynder
24. september 2003 - 22:08 #16
Ingen som kan hjælpe med clipboardet? (ellers lukker jeg)
Avatar billede poull Nybegynder
04. juni 2004 - 10:19 #17
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester