2012-05-02 16 views
16

Disculpas por el título algo vago, no puedo descifrar cuáles son las palabras clave aquí. El de configuración muy simple, estoy abriendo una imagen conExcepción de argumento ilegal ImageIO.read - bandas de trama/componentes de espacio de color?

ImageIO.read(new File(filename)); 

Esto funciona para la mayoría de los archivos, sin embargo, para uno consigo un 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 un sonido. No estoy seguro de qué está causando la excepción.

Una solución alternativa sería más que aceptable: no estoy preocupado con el uso de 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:

enter image description here

+0

me sale el mismo error (al menos cuando se utiliza 'ImageIO.read (nueva dirección URL ("http://i.imgur.com/rC6Jk.jpg"));'). ¿Es esta la única imagen en blanco y negro que está procesando? –

+0

Difícil de decir: la naturaleza del proceso de recuperación de imágenes es muy indirecta (¡la idea es que el software sea autónomo!). Sin embargo, es el único con una saturación tan baja. ¿Crees que esa es la causa? – mtrc

+0

¿Has encontrado alguna solución para esto? –

Respuesta

11

Así que estaba teniendo este mismo problema y encontró que la imagen era la escala de grises y que la aplicación ImageIO.read por defecto no estaba averiguando eso porque los metadatos de la imagen no eran como se esperaba. Escribí un trabajo 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; 
      } 
     } 
+1

La belleza de SO: un problema que me hubiera tomado dos horas averiguar ahora lleva 10 minutos. Gracias, Tate Moore. – charleslparker

+0

¡Cosas maravillosas! ¡Nunca pensé que alguien volvería y derribaría a este, pero lo hiciste! Cosas encantadoras – mtrc

+0

cuando uso esta solución después de que falla con ImageIO.read (InputStream) no ejecuta el resto del código (mientras que (iter.hasNext()) es falso), pero si omito ImageIO.read (InputStream) parte hace el trabajo. ¿Qué pasa con mi código? – user1052958

4

El mensaje de error es informativo e indica que el número de bandas de trama, como se menciona en el perfil de color ICC, parece ser incorrecta. Usé ImageMagick para quitar el perfil ICC de la imagen. ImageIO posteriormente no tiene problemas para leer las imágenes (~ 1k imágenes malas). Espero que ayude.

+0

¡Lo hizo! Gracias. Definitivamente creo que el mensaje es informativo, está por encima de mi nivel de comprensión, no por su culpa. Gracias por comentar :) – mtrc

1

Es posible leer esta imagen utilizando docemonkeys ImageIO, que es un reemplazo más robusto y tolerante para la imagen original proporcionada por el JRE.

Ver https://github.com/haraldk/TwelveMonkeys/

He encontrado esta solución en la caja PDF Jira https://issues.apache.org/jira/browse/PDFBOX-3637

Para utilizar twelvemonkeys, es suficiente para agregarlo como una dependencia Maven. Luego se registra antes del procesador de imagen predeterminado.

<dependency> 
    <groupId>com.twelvemonkeys.imageio</groupId> 
    <artifactId>imageio-jpeg</artifactId> 
    <version>3.3.2</version> <!-- Alternatively, build your own version --> 
</dependency> 
Cuestiones relacionadas