Aus PDF extrahierte CMYK-JPEGs erscheinen invertiert

Ich muss mich mit CMYK-JPEGs befassen, die aus einer PDF-Quelle extrahiert wurden. Die PDFs wurden mit Photoshop erstellt.

Das Problem ist, dass Photoshop JPEG-CMYK-Daten in PDF/EPS mit "normalen" Werten speichert, während es in eigenständigen JPEGs invertierte Werte speichert. Wenn also die DCTDecode-Streams byteweise extrahiert und auf die Festplatte geschrieben werden, erscheinen die resultierenden JPEG-Dateien invertiert.

(Die eigentliche Extraktion wird von einem internen Dienstprogramm durchgeführt, das einfach die Bytes aus dem DCTDecode-Stream extrahiert und sie unverändert in eine Datei mit der Endung schreibt. Es ist im Grunde .jpgein binäres Kopieren und Einfügen. Die PDFs stehen zum erneuten Prozess, falls dies erforderlich sein sollte.)

Da die Bilder in ihrem JFIF-Format bleiben müssen, gibt es eine Möglichkeit, eine Markierung in der extrahierten .jpgDatei zu platzieren, damit Photoshop sie mit der richtigen Codierung öffnet? Der Prozess muss verlustfrei sein (keine weitere Entropiecodierung beinhalten).

Die JPEGs enthalten bereits die APP14Markierung, und das Entfernen hat keine Auswirkung.

Unten ist ein Zitat aus den libjpegDokumenten:

"... es scheint, dass Adobe Photoshop invertierte Daten in CMYK-JPEG-Dateien schreibt: 0 steht für 100 % Tintendeckung, anstatt 0 % Tinte, wie Sie es erwarten würden. ... Photoshop 3.0 [und neuer] ... schreibt nicht invertiertes YCCK in EPS/JPEG-Dateien ... (Aber die in reinen JPEG-Dateien verwendete Datenpolarität ändert sich nicht ...)"

Können Sie die Konvertierung der exportierten JPEGs nicht einfach stapelweise zurück in die normale CMYK-Codierung automatisieren? Warum müssen Sie die extrahierten Dateien kennzeichnen - Sie sagen, alle PDFs wurden in Photoshop erstellt?
Wie extrahieren Sie die JPEGs aus den PDFs? Haben Sie bereits einen Ordner mit vielen JPEGs, die alle konvertiert werden müssen? Es wäre gut, diese Informationen in Ihre ursprüngliche Frage aufzunehmen.
Wenn Sie die JPEG-Daten programmgesteuert extrahieren, können Sie gleichzeitig auch die notwendige Arithmetik der Farbwerte automatisieren? Nicht sicher, wie einfach das ist. Ja, Sie haben Recht, ich habe mich wirklich gefragt, ob Sie die Kontrolle über den Extraktionsprozess haben oder nur die Ausgabe handhaben müssen
@unsigned: Wenn die Farbwerte als Floats gespeichert werden, können große Fehler auftreten, aber wenn sie als Ganzzahlen gespeichert werden, sollte das Invertieren nicht so problematisch sein. Ich habe das Gefühl, dass Sie in Ihrer Frage einen Teil des Workflows ausgelassen haben. Beachten Sie jedoch, dass CMYK nicht vom JPEG-Format unterstützt wird, sondern JPG2000. Ich weiß nicht, ob dies einen Unterschied für Ihre Wahl der Bibliotheken macht ...
Ich beziehe mich auf den ursprünglichen JFIF-Standard, der 1 oder 3 Farben (24-Bit) unterstützt. Die fehlende CMYK-Unterstützung wurde in einem späteren Standard behoben. Früher war es ein Problem, wenn Leute JPEGs aus CMYK-Quellen erstellten und versuchten, sie auf Websites zu verwenden. In Bezug auf den Workflow haben Sie dem Vorschlag von e100 widersprochen, Batch-Automatisierung zu verwenden. Photoshop unterstützt dies. Wenn die Farben einfach invertiert werden, kann Photoshop einen Stapelprozess wie "Öffnen, Invertieren, Speichern unter" für eine beliebige Anzahl von Dateien ausführen.
Ich habe den Punkt überhaupt nicht verfehlt. Sie haben immer noch keine Informationen darüber bereitgestellt, welches Tool Sie zum Extrahieren der Bilder verwenden, noch ob die Bilder als Gruppe festgelegt (bereits extrahiert) sind, Sie haben keine Informationen darüber bereitgestellt, ob Sie zu den PDFs zurückkehren können zu erneut extrahieren, und Sie haben nicht angegeben, ob das Endergebnis überhaupt JFIF sein muss. Ich habe einige Dinge erwähnt, die Probleme verursachen könnten, wie veraltete oder unvollständige Bibliotheken usw. Die von Ihnen zitierten Dokumente stammen aus den 90er Jahren und sprechen von Photoshop 3 in der Zukunftsform. Ein Beispielbild könnte auch hilfreich sein.
Sie müssen ein Decode-Array von "0 1 0 1 0 1 0 1" hinzufügen, um alle Kanäle neu zuzuordnen. Wo fügst du es hinzu? Ich habe keine Ahnung. Vielleicht an den hauseigenen Bildextraktor oder an die JPEGs im PDF.

Antworten (3)

Hier in den Adobe-Foren ist ein gleiches Problem mit erfolgreichen Ergebnissen: http://forums.adobe.com/message/4271028

Vielleicht ist das APP14-Tag nicht korrekt? APP14-Tags haben mehr zu bieten, als nur da zu sein. Zu JPEG-Tags: http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe

JPEG-Adobe-Tags

Das „Adobe“-APP14-Segment speichert Bildcodierungsinformationen für DCT-Filter. Dieses Segment kann mit dem zusätzlichen „Adobe“-Tag als Block kopiert oder gelöscht werden, aber beachten Sie, dass es standardmäßig nicht gelöscht wird, wenn alle Metadaten gelöscht werden, da es das Erscheinungsbild des Bildes beeinträchtigen kann.

╔════════╦══════════════════╦══════════╦════════════════════════════════════════════╗
║ Index2 ║     Tag Name     ║ Writable ║               Values / Notes               ║
╠════════╬══════════════════╬══════════╬════════════════════════════════════════════╣
║      0 ║ DCTEncodeVersion ║ N        ║                                            ║
║      1 ║ APP14Flags0      ║ N        ║ Bit 15 = Encoded with Blend=1 downsampling ║
║      2 ║ APP14Flags1      ║ N        ║                                            ║
║      3 ║ ColorTransform   ║ N        ║ 0 = Unknown (RGB or CMYK)                  ║
║        ║                  ║          ║ 1 = YCbCr                                  ║
║        ║                  ║          ║ 2 = YCCK                                   ║
╚════════╩══════════════════╩══════════╩════════════════════════════════════════════╝

Aber das hilft vielleicht nicht, ich erinnere mich an jemanden, der sagte, dass diese privaten Markierungen nicht dazu gedacht sind, PDF-Reader zu führen, aber richtige Dekodier-Arrays sollten es sein.

Die Magie scheint zu sein

/Decodierung 0 1 0 1 0 1 0 1

was die Farbzuordnung invertieren würde. (Ich denke, das ist ein Flag in libjpeg, etwas Ähnliches sollte in jedem ähnlichen Tool verfügbar sein.) Dekodier-Arrays sind in PDFs üblich, gemäß der PDF-Referenz hier: http://partners.adobe.com/public/developer/en/pdf /PDFReferenz.pdf

Ich habe keine Ahnung, ob Sie diese Dekodier-Arrays in PDF-JPEGs einfügen können oder ob Sie dies zur Stream-Verarbeitung Ihres internen Tools hinzufügen müssen. Ich habe kein Beispiel-PDF, an dem ich arbeiten kann, daher kann ich keine weiteren Nachforschungen anstellen (auch die Referenz ist riesig - tl; dr - aber Sie müssen möglicherweise ...)

Dies hat mir geholfen, ein in ein PDF eingebettetes Photoshop-CMYK-JPEG korrekt anzuzeigen. Ich musste das Wörterbuchelement des Image XObject /Decodeauf [1 0 1 0 1 0 1 0].
Dies hat mir auch geholfen, und ich kann überprüfen, dass CMYK-JPEGs, die invertiert wurden, jetzt korrekt wiedergegeben werden. RGB-Bilder brauchen das für mich nicht ... Ich habe jedoch eine Frage: Gilt dies für ALLE CMYK-Bilder, nicht nur für einige? Wird dies auch (immer) korrekt gedruckt? (Also nicht nur für Bildschirm)
@BrechtMachiels Wo stellst du das ein? Geht das mit einem einfachen Hex-Editor?
@Thomas Ich bin darauf gestoßen, als ich versuchte, ein CMYK-JPEG in ein PDF einzubetten, das von meiner Anwendung erstellt wurde, die das PDF von Grund auf neu erstellt (suchen Sie nach Adobe- Referenzen in github.com/brechtm/rinohtype/blob/master/src/rinoh/backend/ pdf/… . Für ein vorhandenes PDF können Sie, wenn das /DecodeElement vorhanden ist, möglicherweise die 0 und 1 austauschen. Ich konnte nicht erraten, was Ihr Anwendungsfall ist, aber wenn Sie ein JPEG aus einem PDF extrahieren , denke ich Das Extraktionstool sollte das wirklich bewältigen ...
@BrechtMachiels Ich verwende pdfimages, um Bilder aus PDF zu extrahieren. In einigen Fällen werden JPG-Dateien invertiert. Ich könnte Bytes in diesen Dateien ändern, weiß aber nicht, wo ich das \DecodeTeil finden kann. Ich verstehe immer noch nicht, ob es sich um einen Parameter für ein Tool oder um einen Datenausschnitt in einem JPG handelt ...
@Thomas (Entschuldigung, ich sehe Ihren Kommentar erst jetzt) ​​Dies könnte ein Fehler in pdfimages (poppler) sein: gitlab.freedesktop.org/cairo/cairo/-/issues/156 . Oder in dem Tool, das das PDF erstellt hat ... Das /Decodeist (oder besser gesagt, kann sein) im PDF. Sie könnten versuchen, die 0 und 1 in der PDF-Datei zu vertauschen, bevor Sie pdfimages ausführen, wenn das /DecodeElement vorhanden ist. Alternativ können Sie die APP14 aus der extrahierten PDF-Datei hinzufügen (oder entfernen). Wenn Sie das PDF teilen können, kann ich versuchen, einen kurzen Blick für Sie zu werfen.

(Haftungsausschluss: Ich habe kein Bild zum Testen - wenn Sie ein solches Bild über eine Filesharing-Site teilen könnten, kann ich es testen und bei Bedarf Anpassungen vornehmen, um zu antworten).

Das Problem hängt höchstwahrscheinlich mit dem fehlenden ICC-Profil zusammen.

Um ein solches Profil einzubetten (oder umzuwandeln), können Sie z.B. ImageMagick, um dies verlustfrei zu machen, ohne die Daten zu beeinträchtigen.

ImageMagick:
http://imagemagick.org/script/index.php

Das Befehlszeilendienstprogramm kann wie folgt verwendet werden, um ein ICC-Profil einzubetten:

convert cmyk.jpg -profile USWebCoatedSWOP.icc cmyk_w_icc.jpg

Konvertieren Sie es optional in den nativen RGB-Farbraum.

Weitere Einzelheiten finden Sie hier:
http://www.imagemagick.org/Usage/formats/#color_profile

Sie können ICC-Profile hier herunterladen:
http://www.adobe.com/support/downloads/detail.jsp?ftpID=4074

Sie können die Farben mit ImageMagick umkehren :

convert input.jpg -negate output.jpg

Das Ergebnis sieht gut aus, ist aber möglicherweise nicht verlustfrei. Zumindest scheint die Dateigröße teilweise deutlich kleiner zu sein.