java - ImageIO.read excepción de argumento ilegal: bandas de trama/componentes de espacio de color?
javax.imageio (3)
Así que tuve este mismo problema y descubrí que la imagen era de escala de grises y que la implementación predeterminada de ImageIO.read no lo estaba resolviendo porque los metadatos de la imagen no eran los esperados. Escribí un trabajo alrededor que reintenta la carga como ''BufferedImage.TYPE_BYTE_GRAY'' si falla la carga principal.
Iterator<ImageReader> iter = ImageIO.getImageReaders(stream);
Exception lastException = null;
while (iter.hasNext()) {
ImageReader reader = null;
try {
reader = (ImageReader)iter.next();
ImageReadParam param = reader.getDefaultReadParam();
reader.setInput(stream, true, true);
Iterator<ImageTypeSpecifier> imageTypes = reader.getImageTypes(0);
while (imageTypes.hasNext()) {
ImageTypeSpecifier imageTypeSpecifier = imageTypes.next();
int bufferedImageType = imageTypeSpecifier.getBufferedImageType();
if (bufferedImageType == BufferedImage.TYPE_BYTE_GRAY) {
param.setDestinationType(imageTypeSpecifier);
break;
}
}
bufferedImage = reader.read(0, param);
if (null != bufferedImage) break;
} catch (Exception e) {
lastException = e;
} finally {
if (null != reader) reader.dispose();
}
}
// If you don''t have an image at the end of all readers
if (null == bufferedImage) {
if (null != lastException) {
throw lastException;
}
}
Disculpas por el título un tanto vago, no puedo averiguar cuáles son las palabras clave aquí. La configuración es bastante simple, estoy abriendo una imagen con
ImageIO.read(new File(filename));
Esto funciona para la mayoría de los archivos, sin embargo, para uno, obtengo una IllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match"
. Esta imagen se obtuvo a través de wget en una URL de Flickr válida, y he usado otras imágenes obtenidas de esta manera, por lo que el método para obtener imágenes parece en principio sólido. No estoy seguro de lo que está causando la excepción.
Una solución alternativa sería más que aceptable: no estoy preocupado por usar ImageIO
en particular, y la imagen se ve bien visualmente. ¡Solo necesito que se lea sin que Java se vuelva loco!
Aquí está la imagen en cuestión, en caso de que sea de alguna utilidad:
El mensaje de error es informativo e indica que el número de bandas de ráster, como se menciona en el perfil de color ICC, parece ser incorrecto. ImageMagick para quitar el perfil ICC de la imagen. Posteriormente, ImageIO no tiene problemas para leer las imágenes (~ 1k imágenes malas). Espero que ayude.
Es posible leer esta imagen utilizando Twelvemonkeys ImageIO, que es un reemplazo más robusto e indulgente para el ImageIO original proporcionado por el JRE.
Consulte https://github.com/haraldk/TwelveMonkeys/
Encontré esta solución en el PDF Box Jira https://issues.apache.org/jira/browse/PDFBOX-3637
Para usar twelvemonkeys, es suficiente agregarlo como una dependencia de Maven. Luego se registra ante el procesador de imágenes predeterminado.
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3.2</version> <!-- Alternatively, build your own version -->
</dependency>