web-dev-qa-db-fra.com

ImageIO incapable d'écrire un fichier JPEG

J'ai un BufferedImage que j'essaye d'écrire dans un fichier jpeg, mais mon programme Java lève une exception. Je suis capable de sauver avec succès le même tampon sur un gif et png. J'ai essayé de chercher des solutions sur Google, mais en vain.

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
44
Karan

OpenJDK n’a pas d’encodeur JPEG natif, essayez d’utiliser le JDK de Sun ou d’utiliser une bibliothèque (telle que JAI

Si je comprends bien, en ce qui concerne la "teinte rosé", Java enregistre le JPEG au format ARVB (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 ARV) et donc à la teinte rouge.

Si vous réimportez l'image en Java, la transparence est toujours présente.

34
Rui Vieira

J'avais le même problème dans OpenJDK 7 et j'ai réussi à contourner cette exception en utilisant une variable imageType de TYPE_3BYTE_BGR au lieu de TYPE_4BYTE_ABGR en utilisant le même OpenJDK.

28
Thunder

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 colorimétrique non pris en charge (dans mon cas, CYMK). Voir Comment convertir correctement les CMJN en RVB en Java? comment résoudre ce problème.

0
rmuller