Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPEG komprimieren - kleiner als 100kb - wie? (https://www.delphipraxis.net/49780-jpeg-komprimieren-kleiner-als-100kb-wie.html)

Yheeky 15. Jul 2005 22:29


JPEG komprimieren - kleiner als 100kb - wie?
 
Hi,

folgendes: In meinem Programm möchte ich ein Bild solange komprimieren lassen, bis das Bild kleiner als 100kb ist. Bei Bildern, die standardmäßig um 1Mb groß sind, funktioniert das ja problemlos. Wenn ich nun ein Bild nehme, was 10MB groß ist, kann < 100kb nicht mal bei Kompressionsstärke 1 erreicht werden. Nun würde ich gerne folgende Funktion so haben, dass mir angezeigt wird, dass das Bild nicht unter 100kb komprimiert werden kann. Wie geht das?

Delphi-Quellcode:
procedure [...]
var Kompression : Byte;
begin
Kompression := 100; // 100 - kaum komprimiert; 1 - sehr komprimiert

repeat
   JPGDatei.CompressionQuality := Kompression;
   JPGDatei.Compress;
   JPGDatei.SaveTofile(JPGDateiname);
   Dec(Kompression)
until GetFileSize(JPGDateiname) < 100; // wenn das Bild kleiner als 100kb ist, aus der Funktion gehen

end;

stefan2005 15. Jul 2005 23:56

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
hi,
ich glaube wenn du eine datei einfach zweimal oder öfters komprimieren lässt, dass es dann keine Auswirkungen mehr hat, oder ? sonst könnte man jede noch so große Datei einfach tausendmal komprimieren lassen und sie würde auf ne Diskette passen :wink:

sprich: wenn nach dem ersten mal Komprimieren die Datei nicht kleiner als 100 KB ist wird sie nach dem zweiten Mal auch nicht kleiner als 100 KB sein, meiner Meinung nach !

cu,
stefan2005

dahead 16. Jul 2005 00:01

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
das ist richtig, gibt auch logisch sonst keinen sinn.

du könntest das bild allerdings verkleinern, indem du die auflösung änderst oder bspw. die farbanzahl heruntersetzt.

supermuckl 16. Jul 2005 02:40

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
falsch. jpeg ist ein verlustbehaftetes format.
je mehr komprimierung, desto kleiner sollte die datei werden.

du solltest wohl immer von dem ausgangsbild-ab komprimieren und nicht jedesmal das komprimierte wieder komprimieren

also bmp -> jpeg

dizzy 16. Jul 2005 05:22

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Und wenn ihr richtig gelesen hättet, dann hättet ihr gesehen, dass er immer von ein un der selben Source komprimiert, mit in der Schleife sinkendem Kompressionsfaktor. Da ist alles in Ordnung. ;)
Frage bei until auch den Kompressionsfaktor auf = 1 oder = 0 ab. Nach der Schleife prüfen ob der Faktor 0 oder größer ist, und schon weisst du ob die Schleife wegen der Dateigröße oder dem Faktor beendet wurde, und kannst entsprechend reagieren.

Gruss,
Fabain

\\edit: Ich würde das allerdings in der Schleife in einen Stream speichern! Das sollte erheblich schneller sein.

\\nochmaledit: @Supermuckl: Wenn man ein jpeg mit exakt dem selben Algo mit exakt den selben settings speichert, dann kommt auch exakt die (fast) selbe Dateigröße hinten raus. "Fast" nur, weil sich auf Grund von Rundungsfehlern Kleinigeiten ändern können.

brechi 16. Jul 2005 09:36

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
exakt das selbe bild
exakt die selben einstellungen
exakt der selbe algo

=> exakt das erselbe ergebnis

oder meinste rundungsfehler sind immer zufall?

dizzy 16. Jul 2005 21:07

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Zitat:

Zitat von brechi
exakt das selbe bild
exakt die selben einstellungen
exakt der selbe algo

=> exakt das erselbe ergebnis

oder meinste rundungsfehler sind immer zufall?

Nein, ich denke an ein bereits ein mal als jpeg gespeichertes Bild, dass geöffnet und erneut als jpeg mit exakt selben Einstellungen gespeichert wird. Nicht von der selben Datenbasis wie die erste Kompression. Die Rundungsfehler treten dann bei der Dekompression auf, und ziehen sich in die 2. Kompression durch und verstärken oder kompensieren sie sich dort. Letzlich kann es dadurch zu ein paar Byte Unterschied kommen (muss es nicht, und es ist sicherlich auch nicht viel ;))

Yheeky 16. Jul 2005 22:34

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Zitat:

Zitat von dizzy
Frage bei until auch den Kompressionsfaktor auf = 1 oder = 0 ab. Nach der Schleife prüfen ob der Faktor 0 oder größer ist, und schon weisst du ob die Schleife wegen der Dateigröße oder dem Faktor beendet wurde, und kannst entsprechend reagieren.

Wie geht das "auch" denn? Ich wollte ne and bzw. or Verknüpfung erstellen aber da meinte er "end erwartet".

Arnulf 16. Jul 2005 22:58

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Also ich kapier das sowieso nicht.
wenn ein bild 10 mb hat, dann hat das einfach eine zu hohe Auflösung.
warum schraubst nicht die Auflösung runter und komprimierst nacher ganz normal.
Dann kommst eh leicht unter 100 kb.
640x480 oder sowas und du hast eine halbwegs annehmbare qualität mit 50 kb...

Arnulf

scp 17. Jul 2005 00:28

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Zitat:

Zitat von Yheeky
Wie geht das "auch" denn? Ich wollte ne and bzw. or Verknüpfung erstellen aber da meinte er "end erwartet".

Wie beim Rechnen, mit Klammern:

Delphi-Quellcode:
   Dec(Kompression);
until (GetFileSize(JPGDateiname) < 100) or (Kompression < 1);

dizzy 17. Jul 2005 03:13

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Zitat:

Zitat von Arnulf
Also ich kapier das sowieso nicht.
wenn ein bild 10 mb hat, dann hat das einfach eine zu hohe Auflösung.
warum schraubst nicht die Auflösung runter und komprimierst nacher ganz normal.
Dann kommst eh leicht unter 100 kb.
640x480 oder sowas und du hast eine halbwegs annehmbare qualität mit 50 kb...

Arnulf

Eventuell ist ihm die Größe der Bilder aber wichtig, und stellt sie der Qualität voran. Ich halte das Vorhaben für durchaus legitim, bzw. nicht sinnbefreit. Es kommt halt darauf an, was man letztlich will.

SirThornberry 17. Jul 2005 08:12

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
besser als einfach die Kompression immer um 1 du decrementieren wäre es wenn man einfach die Größe der Datei nimmt und anhand dessen ausrechnet um wieviel die kompression ungefähr heruntergesetzt werden sollte. Oder eben ein näherungsverfahren. Wenn dein Bild also bei Compression 100, 5 MB groß ist und bei Compression 50 nur 2 MB so kann man davon ausgehen das bei einer Compression von 75 das bild 3,5 MB groß wird...

dizzy 17. Jul 2005 14:02

Re: JPEG komprimieren - kleiner als 100kb - wie?
 
Zitat:

Zitat von SirThornberry
besser als einfach die Kompression immer um 1 du decrementieren wäre es wenn man einfach die Größe der Datei nimmt und anhand dessen ausrechnet um wieviel die kompression ungefähr heruntergesetzt werden sollte. Oder eben ein näherungsverfahren. Wenn dein Bild also bei Compression 100, 5 MB groß ist und bei Compression 50 nur 2 MB so kann man davon ausgehen das bei einer Compression von 75 das bild 3,5 MB groß wird...

Das ist an sich wohl keine üble Idee, es zunächst in 10er-Schritten zu komprimieren, und dann per Interpolation einen wahrscheinlichern Wert zu ermitteln. Das könnte ganz brauchbar - wenn auch nicht perfekt werden.
Aber ich habe es aber so verstanden, dass hier nicht die Geschwindigkeit das Problem ist, sondern bloß der Abbruch bei nicht kleiner komprimierbaren Bildern ;)

Da du jetzt erkennen kannst ob ein Bild nicht kleiner geht, und du sie ganz dringend < 100k brauchst, und die Auflösung dann auch mal leiden darf, kannst du ja versuchen die Bildgröße nach erfolgloser Kompression um 10% oder so zu verringern, und das ganze nochmal. Dann hast du einen Kompromiss aus Größe beibehalten und Zielkompression.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz