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

使用java将透明gif/png转换为jpeg

如何解决《使用java将透明gif/png转换为jpeg》经验,为你挑选了2个好方法。

我想使用Java将gif图像转换为jpeg.它适用于大多数图像,但我有一个简单的透明gif图像:

输入gif图像http://img292.imageshack.us/img292/2103/indexedtestal7.gif

[如果图像丢失:它是一个蓝色圆圈,周围有透明像素]

当我使用以下代码转换此图像时:

File file = new File("indexed_test.gif");
BufferedImage image = ImageIO.read(file);
File f = new File("indexed_test.jpg");
ImageIO.write(image, "jpg", f);

此代码可以在不抛出异常的情况下工作,但会导致无效的jpeg图像:

输出jpeg图像

[如果图像丢失:IE无法显示jpeg,Firefox会显示无效颜色的图像.]

我正在使用Java 1.5.

我还尝试使用gimp将示例gif转换为png并使用png作为Java代码的输入.结果是一样的.

这是JDK中的错误吗?如何在没有第三方库的情况下正确转换图像?

更新:

答案表明jpeg转换无法正确处理透明度(我仍然认为这是一个错误)并建议使用预定义颜色替换透明像素的解决方法.这两种建议的方法都非常复杂,所以我实现了一个更简单的方法(将作为答案发布).我接受了第一个已发布的答案(Markus).我不知道哪种实现更好.我选择了最简单的一个,但我发现它不起作用的gif.



1> 小智..:

对于Java 6(我认为也是5):

BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
g = bufferedImage.createGraphics();
//Color.WHITE estes the background to white. You can use any other color
g.drawImage(image, 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), Color.WHITE, null);



2> asalamon74..:

正如在问题的更新中已经提到的,我已经实现了一种用预定义颜色替换透明像素的更简单方法:

public static BufferedImage fillTransparentPixels( BufferedImage image, 
                                                   Color fillColor ) {
    int w = image.getWidth();
    int h = image.getHeight();
    BufferedImage image2 = new BufferedImage(w, h, 
        BufferedImage.TYPE_INT_RGB);
    Graphics2D g = image2.createGraphics();
    g.setColor(fillColor);
    g.fillRect(0,0,w,h);
    g.drawRenderedImage(image, null);
    g.dispose();
    return image2;
}

我以这种方式在jpeg转换之前调用此方法:

if( inputImage.getColorModel().getTransparency() != Transparency.OPAQUE) {
    inputImage = fillTransparentPixels(inputImage, Color.WHITE);
}


这个更简单的方法消耗的内存是接受答案的两倍吗?
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有