Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#1

JPEG(-Prinzip) nachgeproggt - ohne TJPEGImage etc.

  Alt 23. Nov 2004, 02:47
So Leute, nach langer Bastelei definiere ich mein eigenes JPEG-Like Bildformat als für vorläufig fertig.
Entstanden ist eine Klasse die ähnlich der TJPEGImage zu bedienen ist - als wesentliche Properties stehen:
  • TFKJPEG.LoadFromFile(FileName: String)
  • TFKJPEG.SaveToFile(FileName: String)
  • TFKJPEG.Bitmap: (TBitmap | TBitmap32)
  • TFKJPEG.Quality: 1..100

Das Verfahren mit dem die Kompression statt findet ist vollständig von JPEG abgeguckt, aber das hat's echt nicht einfacher gemacht . Von daher sehen die Bilder bei entsprechend starker Kompression auch JPEG-mäßig aus - sie sind es de facto.
TFKJPEG ist freilich bei weitem nicht so schnell wie die High-End Implementationen kommerzieller Produkte, aber ich bin ja schon ein wenig stolz dass es überhaupt geht .
Die Quality wird genau so wie bei JPEGs verwendet: 100 = höchste Qualität, 1 = niedrigste Qualität.

Wie siehts mit der Bildqualität im vergleich zu JPEG bezogen auf die Dateigröße aus? Nun, das ganze ist so gehalten dass ein und das selbe Bild mit gleichem Quality-Wert sowohl als echtes JPEG als auch als TFKJPEG annähernd gleich groß werden. Die Bildqualität ist im mittleren Bereich bei echtem JPEG deutlich besser (die bekommen die Blockung so schön weg... ), allerdings relativiert sich das recht schnell bei den besseren Settings. Sogar so weit, dass TFKJPEG bei Quality = 100 eine (minimal) höhere Bildqualität bietet, was sich aber auch sehr deutlich in der Dateigröße wiederspiegelt.
Zu den schlechteren Qualitäten (20 bis 1) hin erzeugt echtes JPEG merkbar kleinere Dateien, die aber auch schlechter aussehen. Und wer komprimiert schon so stark (bei Standbildern )?

Ich lege den kompletten Source zu Studienzwecken offen - wobei der alleine zum Verständnis nicht ganz ausreichen dürfte. Hierzu waren abenteuerliche Exkurse in die Human-Biologie, Physik, Mathematik und Kompressionsalgorithmen notwendig. Ich habe bei diesem Projekt einen ganzen Haufen gelernt, und in Verbindung mit Google und WiKiPedia sollte sich das Konzept an sich recht schnell erfassen lassen.
Wenn da interesse besteht: Hier eine offene Lösung als Code (habe ich nämlich nirgends komplett gefunden...).

Im Anhang sind 2 Versionen. Einmal für die Graphics32-Lib, und einmal für VCL ohne Extrakompos. Erstere Version ist die eigentlich originale und einen Happen schneller, da die VCL-Variante nur ein Port ist, und bei der G32 ist der Zugriff via Canvas.Pixels[x,y] nahezu so schnell wie mit Scanline - das hab ich in der VCL-Variante nicht geändert...
Ein kleines Beispielprojekt (auch kompiliert) liegt mit bei, welches zwischen BMP, JPG und KPG (eigenes Format) konvertiert.

Was noch anstünde ist reichlich Laufzeit- und Speicheroptimierung. Da hab ich schon so einige Stellen an die ich nochmal ran möchte - da ist sicherlich noch viel möglich. Aber leserlicher wird wahrscheinlich dieses hier sein

btw: Die Unit "Huffman.pas" kann auch separat verwendet werden um beliebige Daten damit zu komprimieren. Sie müssen nur in den in der Unit deklarierten Array-Typ verpackt werden .


So, als nächstes kommt .mp3, und dann die ganze Welt *hrhrr*

Für Kritik/Anregungen/Fragen bin ich latürnich immer zu haben!


Guts Nächtle,
Fabian
Angehängte Dateien
Dateityp: zip vcl.zip (299,9 KB, 43x aufgerufen)
Dateityp: zip g32.zip (324,0 KB, 30x aufgerufen)
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat