ImageIO.write не сохраняется как gif, но работает для jpgs и pngs? - PullRequest
4 голосов
/ 26 февраля 2009

Я подозреваю, что решение здесь, вероятно, очень простое, но я в тупике ...

// Create the buffered image.
BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

// fill image data (works fine)
ImageIO.write(bufferedImage, "JPG", f1); // works fine
ImageIO.write(bufferedImage, "PNG", f2); // works fine
ImageIO.write(bufferedImage, "GIF", f3); // this returns false, creates a broken gif file, but fires no exceptions

Не работает ли ImageIO.write() для GIF-файлов? Это какой-то возврат к GIF, являющемуся собственностью Compuserve? Или я просто тупой (наверное, последний :))

Ответы [ 2 ]

5 голосов
/ 26 февраля 2009

Чтобы расширить ответ Ини:

То, что вы должны делать, это не сохранять как gif, в основном. GIF - это 256-цветное изображение на поддонах (отсюда и небольшой размер файла). Если ваше изображение имеет более 256 цветов, вам нужно уменьшить выборку до 256, прежде чем пытаться сохранить. кодировщик не делает это за вас, потому что не знает, что делать. оно, вероятно, начинает писать изображение, и когда оно превышает 256 цветов, просто выручает.

Я думаю, вы могли бы сделать это так (psuedocode)

// Create the buffered image.
BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

... //fill image data (works fine)

ImageIO.write(bufferedImage, "JPG", f1); // works fine

ImageIO.write(bufferedImage, "PNG", f2); //works fine

// downsample to lower color depth by using BYTE_RGB?
BufferedImage crappyImage = new BufferedImage(w,h,BufferedImage.TYPE_BYTE_RGB);
crappyImage.getGraphics().drawImage(bufferedImage, 0, 0, w, h, null);
// or you could repeat the drawing code above with less colors


if (!ImageIO.write(crappyImage , "GIF", f3))
{
   //still too many colors
   f3.delete();
   showError( "Could not save as gif, image had too many colors" );
}

Если ваш чертежный код использует сглаживание, чтобы выглядеть красиво, это увеличит глубину цвета, не думая об этом. Например, рисование диагональной синей линии АА на белом фоне может выглядеть как 2 цвета, Color.WHITE и Color.BLUE, но если вы присмотритесь, у вас будет целый набор оттенков синего, чтобы избавиться от неровный вид диагональной линии.

3 голосов
/ 26 февраля 2009

http://java.sun.com/javase/6/docs/api/javax/imageio/package-summary.html#gif_plugin_notes

Обратите внимание, что GIF может хранить только 256 цветов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...