Parece que hay cierto debate sobre si los archivos JPEG con canales alfa son válidas o no. La respuesta que siempre he entendido como correcta es that in the JPEG FAQ, que es esencialmente "No". (Esto se reitera en another question on Stack Overflow.)¿Puedo usar libjpeg para leer archivos JPEG con un canal alfa?
Sin embargo, JPEGImageWriter de Java en la biblioteca ImageIO de Sun estará feliz de escribir y leer en escala de grises y RGB imágenes con un canal alfa, a pesar de que prácticamente no existen aplicaciones en Linux que he probado hasta ahora que cargará dichos archivos JPEG correctamente. Esto ha sido reportado en el pasado como un error, pero la respuesta de Sun es que these are valid files:
Esto no es una imagen I/O error, sino más bien una deficiencia en las otras aplicaciones el remitente menciona. El IIO JPEGImageWriter es capaz de escribir con imágenes un modelo de color que contiene un canal alfa (que se refiere el código nativo fuente IJG como los espacios de color "NIFTY", como RGBA, YCbCrA, etc.), pero son muchas aplicaciones no consciente de estos espacios de color. Entonces, aunque estas imágenes escritas por el escritor IIO JPEG cumplen con la especificación JPEG (que es ciego a las diversas posibilidades de espacio de color), algunas aplicaciones pueden no reconocer espacios de color que contienen un canal alfa y pueden arrojar un error o renderizar una imagen corrupta, como describe el remitente.
Los desarrolladores que deseen mantener la compatibilidad con estas otras aplicaciones -alfa conscientes deben escribir imágenes que no contienen un canal alfa (como TYPE_INT_RGB). Los desarrolladores que desean la capacidad de la escritura/lectura de una imagen que contiene un canal alfa en el formato JPEG puede hacerlo a través de la imagen de E/S API, pero hay que tener en cuenta que muchas aplicaciones nativas por ahí no son bastante compatible con el Formatos YCbCrA y RGBA.
Para obtener más información, ver la imagen de E/S de metadatos JPEG Formato de Especificaciones y Notas de uso: http://java.sun.com/j2se/1.4.1/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
cierre como "no es un error". xxxxx xxxxx @ 2003-03-24
Estoy trabajando con una aplicación Java que crea archivos como estos, y quiero escribir algo de código C que cargará éstos lo más rápido posible. (Básicamente, el problema es que la biblioteca Java ImageIO es notablemente lenta para descomprimir estos archivos, y nos gustaría reemplazar el cargador con código nativo a través de JNI que mejora esto; es un cuello de botella de rendimiento en este momento).
algunos archivos de ejemplo aquí - disculpas a cualquiera que esté coulrophobic:
y aquí se puede ver el resultado de intentar ver la escala de grises + alfa y las imágenes alfa RGB + con varios bits de software de Linux que creo usar libjpeg
:
para que parezca como si el espacio de color simplemente está siendo mal interpretado en cada caso.Los valores autorizada únicamente en jpeglib.h
son:
/* Known color spaces. */
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
JCS_RGB, /* red/green/blue */
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
JCS_CMYK, /* C/M/Y/K */
JCS_YCCK /* Y/Cb/Cr/K */
} J_COLOR_SPACE;
... que no parece prometedor.
Si se me carga de estas imágenes con una versión ligeramente modificada de example.c
de libjpeg
, los valores de cinfo.jpeg_color_space
y cinfo.out_color_space
para cada imagen después de la lectura de la cabecera son los siguientes:
gray-normal.jpg: jpeg_color_space is JCS_GRAYSCALE, out_color_space is JCS_GRAYSCALE
gray-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
rgb-normal.jpg: jpeg_color_space is JCS_YCbCr, out_color_space is JCS_RGB
rgb-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
Por lo tanto, mis preguntas son:
- ¿Se puede usar libjpeg para leer correctamente estos archivos?
- Si no es así, ¿existe una biblioteca de C alternativa que pueda usar que pueda resolverlos?
Es obvio que hay al menos otras dos soluciones al problema más general:
- cambiar el software para dar salida a los archivos JPEG normales + un archivo PNG que representa el canal alfa
- De alguna manera mejorar el rendimiento de Sun ImageIO
... pero la primera implicaría muchos cambios de código, y no está claro cómo hacerlo. En cualquier caso, creo que la cuestión de cómo usar libjpeg
para cargar dichos archivos es probable que sea una de más interés general.
Cualquier sugerencia sería muy apreciada.
¡No, no lo sabía! Gracias por la sugerencia. –
Desafortunadamente, no puedo obtener libjpeg-turbo para decodificar correctamente estas imágenes, pero estoy aceptando esto como la respuesta más útil. –