2010-08-07 24 views
34

Tengo una Imagen Buffered Estoy tratando de escribir en un archivo jpeg, pero mi programa Java arroja una excepción. Puedo guardar con éxito el mismo buffer en un gif y png. Intenté buscar soluciones en Google, pero fue en vano.ImageIO no puede escribir un archivo JPEG

Código:

File outputfile = new File("tiles/" + row + ":" + col + ".jpg"); 
    try { 
     ImageIO.write(mapBufferTiles[row][col], "jpg", outputfile); 
    } catch (IOException e) { 
     outputfile.delete(); 
     throw new RuntimeException(e); 
    } 

Excepción:

Exception in thread "main" java.lang.RuntimeException: javax.imageio.IIOException: Invalid argument to native writeImage 
at MapServer.initMapBuffer(MapServer.java:90) 
at MapServer.<init>(MapServer.java:24) 
at MapServer.main(MapServer.java:118) 
Caused by: javax.imageio.IIOException: Invalid argument to native writeImage 
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) 
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055) 
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:357) 
at javax.imageio.ImageWriter.write(ImageWriter.java:615) 
at javax.imageio.ImageIO.doWrite(ImageIO.java:1602) 
at javax.imageio.ImageIO.write(ImageIO.java:1526) 
at MapServer.initMapBuffer(MapServer.java:87) 
... 2 more 
+1

¿Está en una plataforma que permite: en los nombres de archivo? – mwittrock

+2

¿Estás usando OpenJDK? OpenJDK no tiene un codificador JPEG nativo IIRC –

+0

@mwittrock, sí en linux (el mismo nombre de archivo funciona para png y gif) – Karan

Respuesta

29

OpenJDK no tiene un codificador JPEG nativo, intente utilizar el JDK de Sun, o el uso de una biblioteca (como JAI

yo sepa, con respecto al "tinte rosado", Java guarda el JPEG como ARGB (aún con información de transparencia). La mayoría de los espectadores, al abrir, suponen que los cuatro canales deben corresponder a un CMYK (no a ARGB) y d así el tinte rojo.

Si vuelve a importar la imagen a Java, la transparencia aún está allí.

+0

En cuanto al problema del tinte rosa, acabo de convertir los píxeles transparentes a los blancos según: http://stackoverflow.com/questions/464825/converting-transparent-gif-png-to-jpeg-using-java/1545417# 1545417 – Karan

+0

Genial, buen descubrimiento. –

+1

Fin del 2do párrafo - no debería * ".. como así el tinte rojo." * Be * ".. y por lo tanto el tinte rojo." *? –

21

que tenían el mismo problema en OpenJDK 7 y me las arreglé para conseguir alrededor de esta excepción mediante el uso de un imageType de TYPE_3BYTE_BGR en lugar de TYPE_4BYTE_ABGR utilizando el mismo OpenJDK.

+1

¡Tienes razón! Creé una nueva Imagen Buffered de TYPE_3BYTE_BGR y usé getRGB() desde BufferedImage de TYPE_INT_ARGB y setRGB() en una nueva BufferedImage y luego llamé a ImageIO.write() y funciona en Linux. –

+0

Aún existe problema en OpenSDK 8 pero esta solución resuelve el problema. – AndroidDev

0

se obtiene el mismo error

Caused by: javax.imageio.IIOException: Invalid argument to native writeImage 
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) 
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055) 

si utiliza un espacio de color no es compatible (en mi caso CYMK). Vea How to convert from CMYK to RGB in Java correctly? cómo solucionar esto.

Cuestiones relacionadas