Чтобы расширить ответ Ини:
То, что вы должны делать, это не сохранять как 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, но если вы присмотритесь, у вас будет целый набор оттенков синего, чтобы избавиться от неровный вид диагональной линии.