26. juni 2003 - 12:01Der 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:
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.
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 :/
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.
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.
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 :)
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.
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?
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.
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...
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 :)
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 :)
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.