ImageIO не может записать файл JPEG - PullRequest
46 голосов
/ 08 августа 2010

У меня есть BufferedImage, я пытаюсь записать в файл JPEG, но моя Java-программа выдает исключение.Я могу успешно сохранить тот же буфер в GIF и PNG.Я пытался найти в Google решения, но безрезультатно.

Код:

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

Ответы [ 3 ]

38 голосов
/ 08 августа 2010

OpenJDK не имеет собственного кодера JPEG, попробуйте использовать JDK от Sun или использовать библиотеку (например, JAI

AFAIK, что касается "розоватого оттенка", Java сохраняет JPEGкак ARGB (все еще с информацией о прозрачности). Большинство зрителей, открывая, предполагают, что четыре канала должны соответствовать CMYK (не ARGB) и, следовательно, красному оттенку.

Если вы импортируете изображение обратно в Java,прозрачность все еще там.

32 голосов
/ 25 июля 2013

У меня была та же проблема в OpenJDK 7, и мне удалось обойти это исключение, используя imageType из TYPE_3BYTE_BGR вместо TYPE_4BYTE_ABGR, используя тот же OpenJDK.

0 голосов
/ 26 января 2017

Вы получаете ту же ошибку

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)

, если используете неподдерживаемое цветовое пространство (в моем случае CYMK).См. Как правильно конвертировать из CMYK в RGB в Java? Как решить эту проблему.

...