2010-08-07 5 views
34

J'ai une image tamponnée J'essaie d'écrire dans un fichier jpeg, mais mon programme Java lève une exception. Je suis en mesure de sauvegarder avec succès le même tampon à un gif et png. J'ai essayé de chercher des solutions sur Google, mais en vain.ImageIO impossible d'écrire un fichier JPEG

code:

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); 
    } 

Exception:

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

Êtes-vous sur une plate-forme qui permet: dans les noms de fichiers? – mwittrock

+2

Utilisez-vous OpenJDK? OpenJDK n'a pas d'encodeur JPEG natif IIRC –

+0

@mwittrock, yep sur linux (même nom de fichier fonctionne pour png et gif) – Karan

Répondre

29

OpenJDK ne dispose pas d'un encodeur JPEG natif, essayez d'utiliser JDK de Sun, ou en utilisant une bibliothèque (comme JAI

AFAIK, en ce qui concerne la "teinte rosée", Java enregistre le JPEG en tant qu'ARGB (toujours avec des informations de transparence) .La plupart des téléspectateurs, lors de l'ouverture, supposent que les quatre canaux doivent correspondre à un CMJN (non AR d donc la teinte rouge.

Si vous importez de nouveau l'image vers Java, la transparence est toujours présente.

+0

En ce qui concerne le problème de la teinte rose, je viens de convertir les pixels transparents en pixels blancs comme suit: http://stackoverflow.com/questions/464825/converting-transparent-gif-png-to-jpeg-using-java/1545417# 1545417 – Karan

+0

Cool, bonne trouvaille. –

+1

Fin du 2ème paragraphe - ne devrait pas * ".. ainsi que la teinte rouge." * Be * "et donc la teinte rouge." *? –

21

J'ai eu le même problème dans OpenJDK 7 et je réussi à contourner cette exception en utilisant un imageType de TYPE_3BYTE_BGR au lieu de TYPE_4BYTE_ABGR en utilisant la même OpenJDK.

+1

Vous avez raison !!! J'ai créé une nouvelle BufferedImage de TYPE_3BYTE_BGR et utilisé getRGB() de BufferedImage de TYPE_INT_ARGB et setRGB() sur new BufferedImage, puis appelé ImageIO.write() et cela fonctionne sous Linux. –

+0

Problème existe toujours dans OpenSDK 8 mais cette solution résout le problème. – AndroidDev

0

Vous obtenez la même erreur

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 vous utilisez un espace couleur non pris en charge (dans mon cas CMYK). Voir How to convert from CMYK to RGB in Java correctly? comment résoudre ce problème.

Questions connexes