unsupported - Java ImageIO IIOException: ¿Tipo de imagen no compatible?
javax imageio iioexception unsupported image type (3)
Desafortunadamente, me he topado con muchos archivos JPEG estándar que violan ImageIO es particularmente delicado y, a menudo, se niega a cargar imágenes, que a menudo se cargan y aparentemente se muestran correctamente con otro software con controles menos estrictos en el formato del archivo.
No es muy bonito, pero una solución es usar el decodificador JPEG interno de Oracle VM directamente (com.sun.image.codec.jpeg.JPEGCodec), ya que parece tolerar más desviaciones de especificaciones como el contenedor ImageIO:
BufferedImage img =
JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();
Por supuesto, esta no es una solución ideal, ya que el uso de clases específicas de implementación lo vinculará con un proveedor de máquinas virtuales específico y puede romper con las versiones más nuevas de máquinas virtuales, pero si solo usará el software en un entorno controlado, puede ser mejor que no hacerlo. solución en absoluto.
Trabajar con imágenes en Java por primera vez y obtengo algunas excepciones extrañas que no están bien documentadas. Aquí está la línea de código que está fallando:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
Esta línea está lanzando una excepción IIOException con un tipo de imagen no compatible como mensaje de excepción. He comprobado y he vuelto a comprobar que es en realidad esta línea que lanza la excepción, que el objeto Archivo es válido, que la URL es válida y que image.jpg
es de hecho un image.jpg
JPG válido que se carga perfectamente en otra imagen espectadores
¿Qué podría hacer para obtener más información sobre la naturaleza de esta excepción? ¿Es esta la forma tradicional de cargar imágenes en Java 7 o es un método antiguo / obsoleto? Simplemente no hay mucha información sobre estas excepciones de "tipo de imagen no compatible" y, seguramente, ¡ImageIO admitió JPG!
¡Gracias por cualquier ayuda!
Intenta comprobar la codificación del JPEG. ImageIO
no puede leer imágenes jpeg codificadas en CMYK, por ejemplo. AFAIK, ImageIO no se ha actualizado durante años, por lo que le gustaría probar y usar la alternativa / extensión oficial: JAI ImageIO .
Desafortunadamente, JAI ImageIO necesita que algunas bibliotecas nativas estén instaladas en el JRE, lo que podría no ser deseado. Hacemos lo siguiente:
- Usa Apache Sanselan para detectar, ya sea un JPEG
- Ya que Sanselan no puede leer y escribir JPEG, use el antiguo AWT
JPEGCodec
:JPEGCodec.createJPEGDecoder(...)
- para convertir CMYK a RGB, obtenemos el ráster de la imagen
BufferedImage
y lo convertimos manualmente (puede usar perfiles ICC, pero la conversión manual se ajusta a nuestras necesidades)
Esta es una pregunta mía que resultó del hecho de que ImageIO
no es compatible con todos los tipos de imágenes JPEG, y allí mencioné un poco más de mis descubrimientos de por qué recibiste ese mensaje: Alternativa de Java pura a JAI ImageIO para detectar imágenes CMYK
Otra opción es usar .jar preparado por Werner Randelshofer:
http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/ o Monte Media Library: http://www.randelshofer.ch/monte/
Parece bastante fácil y similar al uso de ImageIO y está disponible bajo la licencia CC.