Solución:
Intente 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.
Lamentablemente, JAI ImageIO necesita algunas bibliotecas nativas instaladas en el JRE, lo que puede no ser deseado. Hacemos lo siguiente:
- use Apache Sanselan para detectar, ya sea un JPEG
- ya que Sanselan no puede leer y escribir JPEG, use el AWT simple y antiguo
JPEGCodec
:JPEGCodec.createJPEGDecoder(...)
- para convertir CMYK a RGB, obtenemos el ráster de la lectura
BufferedImage
y convertirlo manualmente (puede usar perfiles ICC, pero la conversión manual se adapta a nuestras necesidades)
Aquí hay una pregunta mía que resultó del hecho de que ImageIO
no admite todos los tipos de imágenes JPEG, y allí expuse un poco más de mis hallazgos de por qué recibe ese mensaje: alternativa de Java puro a JAI ImageIO para detectar imágenes CMYK
Desafortunadamente, me he encontrado con muchos archivos JPEG que violan los estándares. ImageIO es particularmente exigente y, a menudo, se niega a cargar imágenes, que a menudo se cargan y aparentemente se muestran correctamente por otro software con controles menos estrictos en el formato de 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 bloqueará con un proveedor de VM específico y puede romper con versiones más nuevas de VM, pero si solo usará el software en un entorno controlado, puede ser mejor que no. solución en absoluto.
Para trabajar con imágenes en un formato específico, debe agregar la dependencia correspondiente, como imageio-jpeg o imageio-tiff:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-bmp</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.3.2</version>
</dependency>
la API Java de ImageIO incorporada carga los complementos automáticamente en tiempo de ejecución.