使用ImageIO写入功能的GIF文件中的透明度问题

时间:2014-01-28 10:45:16

标签: java swt

序言:我试图将swt ImageData保存到gif文件中,但却抛出了“不支持的颜色深度”。我决定将org.eclipse.swt.graphics.ImageData转换为java.awt.image.BufferedImage,并且在我开始使用透明度之前一切正常。

问题:透明像素未正确处理,而是使用绘制GC时使用的最后一种前景色进行着色。我注意到这个不受欢迎的效果在我的代码中落到了这一行。

ImageIO.write(bufferedImage, "gif", file);

在进行一些网络搜索后,我发现问题已在JDK 7中解决http://ubuntuforums.org/archive/index.php/t-1060128.html

问题是我必须使用Java 6而不是7.有人可以告诉我这是如何实现的吗?

1 个答案:

答案 0 :(得分:0)

我有类似的问题。我有ImageData,我正在尝试写入具有透明度的GIF或PNG。我使用了以下转换功能,它对我有用。

static BufferedImage convertToAWT(ImageData data) {
    ColorModel colorModel = null;
    PaletteData palette = data.palette;
    if (palette.isDirect) {
        int alphaMask = 0xff;
        colorModel = new DirectColorModel(data.depth, palette.redMask, palette.greenMask, palette.blueMask, alphaMask);

        BufferedImage bufferedImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
        for (int y = 0; y < data.height; y++) {
            for (int x = 0; x < data.width; x++) {
                int pixel = data.getPixel(x, y);
                RGB rgb = palette.getRGB(pixel);

                // ASSUME that pixel==0 is transparent!!!!

                int alpha = (pixel == 0) ? 0 : alphaMask; 

                bufferedImage.setRGB(x, y, alpha << 24 | rgb.red << 16 | rgb.green << 8 | rgb.blue);
            }
        }
        return bufferedImage;
    } else {
        return null;   // not supported
    }
}


private static void writeToFile(Image img, String name)
{
    BufferedImage ii = convertToAWT(img.getImageData());

    try
    {
        // You can change this to write GIF or JPG also

        ImageIO.write(ii, "PNG", new File(name + ".png"));
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}        

请注意,这假设像素零是透明的。那可能不是你的情况。也许您可以尝试其他值,如-1或255等,看看哪些有效。祝你好运。