Was kann ich gegen zerschnittene Bilder tun?
Wenn ich versuche, Bilder aus einer PDF-Datei zu extrahieren, kommt es manchmal vor, dass ich einen Haufen von Slices des Originalbildes erhalte, die meist aus ein paar Bildzeilen pro Slice oder im Extremfall aus nur einer Zeile bestehen. Woran liegt das und wie kann ich das gesamte Bild in einem Stück erhalten?
Es gibt verschiedene Gründe, ein Bild in Slices zu unterteilen und diese als separate Bildobjekte in einer PDF-Datei zu speichern. Ein offensichtlicher Grund könnte sein, dass die PDF-Erstellungssoftware ein bereits geschnittenes Quellbild importiert, z. B. eine TIFF-Datei mit Streifen oder Kacheln, ohne die Slices zu einem Bild zusammenzufügen. Ein weiterer häufig anzutreffender Grund ist, dass die PDF-Erstellungssoftware architektonische Beschränkungen hinsichtlich der Größe der Bildmusterdaten hat, z. B. eine native Windows-Anwendung, die eine PDF-Datei über einen virtuellen Druckertreiber erstellt. Und manchmal implementiert eine Grafikbibliothek wie GDI+ maskierte Bilder, indem sie Slices für die sichtbaren Teile erzeugt.
Wenn wir verstanden haben, wie Slices entstehen, wissen wir auch, wie wir die Teile wieder zusammensetzen können. Aber das ist gar nicht so einfach. Hier ist, wie ich es in einem unserer Produkte gemacht habe. Nennen wir es hier Image Merger.
Der Image Merger liest den Content Stream Objekt für Objekt. Wenn er auf ein Bild stößt, legt er eine leere Oberfläche und eine Bildmaske an, bei der alle Bits auf "unsichtbar" gesetzt sind. Der Slice wird in der Oberfläche gespeichert und die entsprechenden Bits in der Maske werden auf "sichtbar" gesetzt. Handelt es sich bei dem nächsten Objekt um ein Bild, wird der Slice auf die gleiche Weise gespeichert. Dieser Vorgang wird so lange wiederholt, bis ein anderer Objekttyp angetroffen wird oder es offensichtlich ist, dass das Bild kein Slice ist, z. B. wenn sich der Farbraum des Bildes ändert. In diesem Fall wird das umschließende Rechteck aller Slices berechnet, das Bild in die Ausgabedatei kopiert und die Oberfläche in ihren Ausgangszustand zurückgesetzt.
Ich muss zugeben, dass dies kein sehr ausgeklügelter Algorithmus ist, und ich hoffe, Sie haben einen besseren Ansatz.