Ich versuche, TIFF-Bilder in einer Datenbank zu archivieren, und ich möchte die Bilder so viel wie möglich komprimieren, selbst auf Kosten einer höheren CPU-Auslastung und eines hohen Speichers.
Um die in LibTiff.NET verfügbaren Komprimierungen zu testen, habe ich den folgenden Code verwendet (modifiziert von dieses Beispiel ):
%Vor%Das Testbild ist 200dpi 24bpp, 1700 Breite mal 2200 Höhe und LZW-Komprimierung; Die Dateigröße beträgt fast 7 MB. (Das Bild ist repräsentativ für die Bilder, die ich speichern möchte.)
Von den Algorithmen, die funktioniert haben ( einige Fehler mit verschiedenen Fehlern ), die kleinste komprimierte Datei wurde mit Compression.Deflate
erstellt, aber nur auf 5MB komprimiert, und ich möchte sie deutlich kleiner (unter 1 MB).
Es muss einen Algorithmus für eine höhere Komprimierung geben; Eine PDF-Datei mit diesem Bild ist etwa 500Kb.
Wenn ein bestimmter Algorithmus nicht mit anderen TIFF-Viewern / Bibliotheken kompatibel ist, ist dies kein Problem, solange wir das komprimierte TIFF aus der Datenbank extrahieren und es mit LibTiff.Net oder einer anderen Bibliothek in ein System.Drawing.Bitmap
konvertieren können .
Wie kann ich noch kleinere Dateien mit verlustfreier Komprimierung erzeugen? Ist das mit diesen Bildern überhaupt möglich?
Aktualisieren
Zwei Teile zur Antwort:
Machen Sie es auf eine Weise verlustbehaftet, wie Sie es wählen, und nicht so, wie es ein verlustreicher Codec tut. Wenn Sie beispielsweise mit gescannten Textbildern arbeiten, führen Sie eine Helligkeits- / Kontrastnormalisierung (möglicherweise lokale Normalisierung) durch, sodass der Seitenhintergrund rein weiß ist. Dies wird die Kompressibilität um einiges verbessern; es könnte eine 10MB Graustufentextseite mit fast, aber nicht genau weißem Hintergrund in eine 200kB Seite mit reinem weißem Hintergrund und Graustufentext (unter Verwendung von LZW)
Verwenden Sie JPEG2000. Wenn Sie eine bestmögliche verlustfreie Komprimierung wünschen, wird JPEG2000 mit verlustfreien Einstellungen wahrscheinlich jeden anderen Algorithmus wie PNG übertreffen, insbesondere für Inhalte wie Fotos, aber auch für gescannte Seiten. Speichern Sie Ihre JPEG2000 in TIFF-Containern sollte auch möglich sein, aber es ist nicht eine sehr häufige Funktion von TIFF-Bibliotheken; Sie können oder wollen nicht das tun. Ich denke JPEG2000 hat eine Funktion für mehrere Bilder in einer Datei.
Nur um ein paar Zahlen auf dem Beispielbild zu geben (das Tiff). Alle Komprimierungen sind verlustfrei und können jedes andere verlustfreie Format wie bmp / png (welches überprüft wurde) neu erstellen.
%Vor%Da Rauschen der wichtigste Faktor ist, um verlustfreie Kompressionspotentiale zu eliminieren, lassen Sie uns einige entfernen. Wir machen das mit diesem Python-basierten Code, aber es gibt viel mehr mögliche Ansätze. Der folgende Code verwendet einen nichtlinearen Filter, der versucht, Rauschen zu entfernen, während wichtige Kanten beibehalten werden.
Natürlich sind hier Informationen verloren, aber ich mag das geraubte Bild eher, weil es (meiner Meinung nach) schöner zu lesen ist.
Tags und Links libtiff.net