当前位置:  开发笔记 > 编程语言 > 正文

ImageIO.write没有保存为gif,但适用于jpgs和pngs?

如何解决《ImageIO.write没有保存为gif,但适用于jpgs和pngs?》经验,为你挑选了1个好方法。

我怀疑这里的解决方案可能很简单,但我很难过......

// 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事物的某种回归吗?或者我只是愚蠢(我猜它是最后一个:))



1> John Gardner..:

扩展Iny的答案:

你应该做的不是基本上保存为gif.GIF是256色的托盘图像(因此它的文件很小).如果图像的颜色超过256种,则需要在尝试保存之前将颜色下采样为256.编码器不会为你做,因为它不知道该怎么做.它可能开始写图像,一旦超过256色,就会挽救.

我想你可以这样做(伪代码)

// 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" );
}

如果您的绘图代码使用Antialiasing看起来不错,那么在不考虑它的情况下会增加颜色深度.例如,在白色背景上绘制AA'd对角蓝线似乎是2种颜色,Color.WHITE和Color.BLUE,但如果你仔细观察,你会有一大堆蓝色阴影来摆脱对角线的锯齿状外观.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有