2010-12-17 15 views
8

ImageIO.read (imagePath) con este archivo da una CMMException, ¿por qué no puede hacer frente a Java este archivo aparentemente válida http://www.jthink.net/jaikoz/scratch/front.jpg¿Por qué cargar este jpg usando JavaIO da CMMException?

java.awt.color.CMMException: Invalid image format 
    at sun.awt.color.CMM.checkStatus(Unknown Source) 
    at sun.awt.color.ICC_Transform.<init>(Unknown Source) 
    at java.awt.image.ColorConvertOp.filter(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at javax.imageio.ImageIO.read(Unknown Source) 
+0

¿Qué versión de Java estás usando? está trabajando para jdk 1.5 y 1.6. – Favonius

+0

Eh, estoy usando 1.6.22 en Windows 7 –

+0

He agregado la stacktrace, tal vez eso arrojará algo de luz sobre ella –

Respuesta

15

Creo que tengo la caída de su problema. Revisé la imagen que vinculó (http://www.jthink.net/jaikoz/scratch/front.jpg). Es debido al estándar Exif y JFIF.

cuando está haciendo algo como ImageIO.read('some file') invoca la implementación predeterminada de sun jpeg com.sun.imageio.plugins.jpeg.JPEGImageReader. Que solía tener problemas al cargar los archivos JFIF BUG 6488904 (verifique el comentario al final).

Según spec, tanto Exif y demandas JFIF que su respectivo segmento marcador solicitud debe ser la primero justo después de SOI (APP1 y APP0) , por lo que no es realmente posible por spec para un archivo JPEG para ser compatible con ambos estándares.

Aunque se informó de mucho tiempo atrás

La solución es utilizar la biblioteca JAI (https://jai.dev.java.net/binary-builds.html#Release_builds). Estoy usando Java (sin aceleración nativa) versión.

SeekableStream seekableStream = new FileSeekableStream(new File("front.jpg")); 
ParameterBlock pb = new ParameterBlock(); 
pb.add(seekableStream); 

BufferedImage image = JAI.create("jpeg", pb).getAsBufferedImage(); 

Espero que esto ayude.

+0

thx, se ve bien Lo veré –

+0

@ user294896: de nada. Si la respuesta resolvió tu problema, por favor, márcalo como aceptado. de esa manera estará fuera de la lista sin respuesta. Gracias. – Favonius

+0

sí funciona, solo me pregunto si hay una manera de hacerlo utilizando la API pública en lugar de las clases Sun subyacentes (como SeekableStream) –

2

Mensaje viejo, pero para referencia futura:

Inspirado por esta pregunta y enlaces que se encuentran aquí, he escrito un plugin para JPEGImageReader ImageIO que soporta imágenes JPEG con este tipo de "malos" los perfiles de color ICC (el "problema" es que el intento de representación en el perfil ICC no es compatible con ColorConvertOp de Java). Es Java simple y no requiere JAI. El código fuente está disponible gratuitamente en:

https://github.com/haraldk/TwelveMonkeys/tree/master/imageio/imageio-jpeg

+0

¿Puede proporcionar una pequeña explicación y un ejemplo en su LÉAME de GitHub sobre cómo integrar y usar su ¿enchufar? Eso seria genial. – Jack

+0

@Jack Haré eso. Además, siéntase libre de archivar los problemas de los documentos que faltan en GitHub, si hay algo que le guste documentado en particular. Pero todo lo que necesita hacer es construir el proyecto usando Maven, y colocar los JAR en la ruta de clase. Lo usará igual que usaría el plugin JPEG estándar (es decir, 'ImageIO.read (...)' o 'ImageIO.getImageReaders (...)'). – haraldK

Cuestiones relacionadas