Los archivos JPEG CMYK extraídos de PDF aparecen invertidos

Tengo que lidiar con archivos JPEG CMYK extraídos de una fuente PDF. Los PDF fueron creados con Photoshop.

El problema es que Photoshop almacena datos JPEG CMYK en PDF/EPS utilizando valores "normales", mientras que en archivos JPEG independientes almacena valores invertidos. Por lo tanto, cuando los flujos de DCTDecode se extraen por bytes y se escriben en el disco, los archivos JPEG resultantes aparecen invertidos.

(La extracción real la realiza una utilidad interna, que simplemente extrae los bytes del flujo de DCTDecode y los escribe, sin modificar, en un archivo que termina en Es básicamente .jpgun copiar y pegar binario. Los archivos PDF están disponibles para re- proceso, en caso de que sea necesario).

Como las imágenes deben permanecer en su formato JFIF, ¿hay alguna forma de colocar un marcador en el .jpgarchivo extraído para que Photoshop lo abra con la codificación adecuada? El proceso debe ser sin pérdidas (no involucrar más codificación de entropía).

Los archivos JPEG ya contienen el APP14marcador y eliminarlo no tiene ningún efecto.

A continuación se muestra una cita de los libjpegdocumentos:

"... parece que Adobe Photoshop escribe datos invertidos en archivos CMYK JPEG: 0 representa una cobertura de tinta del 100 %, en lugar de un 0 % de tinta como cabría esperar... Photoshop 3.0 [y más reciente]... escriba YCCK no invertido en archivos EPS/JPEG... (Pero la polaridad de datos utilizada en archivos JPEG simples no cambiará...)"

¿No puede simplemente automatizar por lotes la conversión de los archivos JPEG exportados a la codificación CMYK normal? ¿Por qué necesita marcar los archivos extraídos? ¿Dices que todos los archivos PDF se crearon en Photoshop?
¿Cómo estás extrayendo los archivos JPEG de los archivos PDF? ¿Ya tiene una carpeta que contiene muchos archivos JPEG que deben convertirse todos? Sería bueno agregar esta información a su pregunta original.
Si está extrayendo los datos JPEG mediante programación, ¿también puede automatizar la aritmética necesaria en los valores de color al mismo tiempo? No estoy seguro de lo fácil que es esto. Sí, tienes razón, realmente me preguntaba si tenías el control del proceso de extracción o solo tenías que manejar su salida.
@unsigned: si los valores de color se almacenan como flotantes, podría haber grandes errores, pero si se almacenan como números enteros, invertirlos no debería ser tan problemático. Siento que ha dejado de lado parte del flujo de trabajo en su pregunta. Sin embargo, tenga en cuenta que CMYK no es compatible con el formato JPEG, sino con JPG2000. No sé si esto hace una diferencia para su elección de bibliotecas...
Me refiero al estándar JFIF original que admite 1 o 3 colores (24 bits). La falta de compatibilidad con CMYK se rectificó en un estándar posterior. Solía ​​ser un problema cuando la gente creaba jpegs a partir de fuentes CMYK y trataba de usarlos en sitios web. En cuanto al flujo de trabajo, se opuso a la sugerencia de e100 de utilizar la automatización por lotes. Photoshop es compatible con esto. Si los colores simplemente se invierten, Photoshop puede ejecutar un proceso por lotes como "abrir, invertir, guardar como" en una cantidad arbitraria de archivos.
No he perdido el punto en absoluto. Todavía no ha proporcionado ninguna información sobre qué herramienta está utilizando para extraer las imágenes, ni si las imágenes como grupo están fijas (ya extraídas), no ha proporcionado ninguna información sobre si puede volver a los PDF para vuelva a extraer, y no ha especificado si necesita que el resultado final sea JFIF. Mencioné algunas cosas que podrían causar problemas, como bibliotecas desactualizadas o incompletas, etc. Los documentos que cita son de los años 90 y hablan de Photoshop 3 en tiempo futuro. Una imagen de muestra también podría ser útil.
Debe agregar una matriz Decode de "0 1 0 1 0 1 0 1" para reasignar todos los canales. ¿Dónde lo agregas? No tengo ni idea. Tal vez al extractor de imágenes interno, o a los jpegs en el PDF.

Respuestas (3)

Aquí en los foros de Adobe hay el mismo problema con resultados exitosos: http://forums.adobe.com/message/4271028

¿Quizás la etiqueta APP14 no es correcta? Hay más en las etiquetas APP14 que simplemente estar ahí. En etiquetas JPEG: http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe

Etiquetas de Adobe JPEG

El segmento "Adobe" APP14 almacena información de codificación de imágenes para filtros DCT. Este segmento se puede copiar o eliminar como un bloque utilizando la etiqueta adicional "Adobe", pero tenga en cuenta que no se elimina de forma predeterminada al eliminar todos los metadatos porque puede afectar la apariencia de la imagen.

╔════════╦══════════════════╦══════════╦════════════════════════════════════════════╗
║ 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                                   ║
╚════════╩══════════════════╩══════════╩════════════════════════════════════════════╝

Pero eso podría no ayudar, recuerdo que alguien dijo que estos marcadores privados no están destinados a guiar a los lectores de PDF, pero deberían ser matrices de decodificación adecuadas.

La magia parece ser

/Decodificar 0 1 0 1 0 1 0 1

lo que invertiría el mapeo de color. (Supongo que es un indicador en libjpeg, algo similar debería estar disponible en cualquier herramienta similar). Las matrices de decodificación son comunes en archivos PDF de acuerdo con la referencia de PDF aquí: http://partners.adobe.com/public/developer/en/pdf /PDFReferencia.pdf

No tengo ni idea de si puede agregar estas matrices de decodificación en PDF JPEG o si necesita agregar eso al procesamiento de flujo de su herramienta interna. No tengo un PDF de ejemplo para trabajar, por lo que no puedo investigar más (además, la referencia es enorme, tl; dr, pero es posible que deba hacerlo ...)

Esto me ayudó a obtener un JPEG CMYK de Photoshop incrustado en un PDF para que se muestre correctamente. Tuve que configurar el /Decodeelemento del diccionario de Image XObject en [1 0 1 0 1 0 1 0].
Esto también me ayudó, y puedo verificar que los JPEG CMYK que estaban invertidos ahora se procesan correctamente. Los RGB no necesitan esto para mí ... Sin embargo, tengo una pregunta, ¿será esto cierto para TODAS las imágenes CMYK, no solo para algunas? Además, ¿esto (siempre) se imprimirá correctamente? (Por lo tanto, no solo para la pantalla)
@BrechtMachiels ¿Dónde configuras esto? ¿Se puede hacer con un simple editor hexadecimal?
@Thomas Me encontré con esto cuando intentaba incrustar un JPEG CMYK en un PDF producido por mi aplicación que crea el PDF desde cero (busque las referencias de Adobe en github.com/brechtm/rinohtype/blob/master/src/rinoh/backend/ pdf/... Para un PDF existente, si el /Decodeelemento está presente, es posible que pueda intercambiar los 0 y los 1. No pude adivinar cuál es su caso de uso, pero si está extrayendo un JPEG de un PDF, creo la herramienta de extracción realmente debería manejar esto...
@BrechtMachiels que estoy usando pdfimagespara extraer imágenes de PDF. En algunos casos, los archivos JPG están invertidos. Podría cambiar bytes en esos archivos, pero no sé dónde encontrar la \Decodeparte. Todavía no entiendo si es un parámetro para una herramienta o un fragmento de datos dentro de un JPG...
@Thomas (Lo siento, solo veo tu comentario ahora) Esto podría ser un error en pdfimages (poppler): gitlab.freedesktop.org/cairo/cairo/-/issues/156 . O en la herramienta que creó el PDF... El /Decodeestá (o mejor dicho, puede estar) en el PDF. Puede intentar intercambiar los 0 y los 1 en el PDF antes de ejecutar pdfimages, si el /Decodeelemento está presente. Alternativamente, puede agregar (o eliminar) el APP14 del PDF extraído. Si puede compartir el PDF, puedo intentar echarle un vistazo rápido.

(Descargo de responsabilidad: no tengo una imagen para probar; si pudiera compartir una imagen de este tipo en un sitio de intercambio de archivos, puedo probar y hacer ajustes para responder si es necesario).

Lo más probable es que el problema esté relacionado con la falta del perfil ICC.

Para incrustar (o convertir) dicho perfil, puede usar f.ex. ImageMagick para hacer esta pérdida de archivos sin afectar los datos.

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

La utilidad de línea de comando se puede usar así para incrustar un perfil ICC:

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

Opcionalmente, conviértalo a un espacio de color RGB nativo.

Vea aquí para más detalles:
http://www.imagemagick.org/Usage/formats/#color_profile

Puede descargar perfiles ICC desde aquí:
http://www.adobe.com/support/downloads/detail.jsp?ftpID=4074

Puedes invertir los colores con ImageMagick :

convert input.jpg -negate output.jpg

El resultado se ve bien, pero puede que no sea sin pérdidas. Al menos, el tamaño del archivo parece ser significativamente menor en algunos casos.