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
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.
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.
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.