序言:我试图将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.有人可以告诉我这是如何实现的吗?
答案 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等,看看哪些有效。祝你好运。