2010-08-07 4 views
34

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

Код:

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

Вы на платформе, которая позволяет: в именах файлов? – mwittrock

+2

Вы используете OpenJDK? OpenJDK не имеет собственный кодировщик JPEG IIRC –

+0

@mwittrock, yep on linux (такое же имя файла работает для png и gif) – Karan

ответ

29

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

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

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

+0

Что касается проблемы с оттенком розового оттенка, я просто преобразовал прозрачные пиксели в белые: http://stackoverflow.com/questions/464825/converting-transparent-gif-png-to-jpeg-using-java/1545417# 1545417 – Karan

+0

Прохладный, приятная находка. –

+1

Конец второго абзаца - не должен * ".. как при этом красный оттенок." * Be * ".. и, следовательно, красный оттенок." *? –

21

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

+1

Ты прав !!! Я создал новый BufferedImage из TYPE_3BYTE_BGR и использовал getRGB() из BufferedImage из TYPE_INT_ARGB и setRGB() в новом BufferedImage, а затем вызвал ImageIO.write(), и он работает в Linux. –

+0

Проблема все еще существует в OpenSDK 8, но это решение решает проблему. – AndroidDev

0

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

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). См. How to convert from CMYK to RGB in Java correctly?, как это решить.

Смежные вопросы