如何使用BITMASK透明度创建BufferedImage?

时间:2014-11-30 19:34:53

标签: java png transparency bufferedimage bitmask

BufferedImage类实现Transparency,它有三个值:

OPAQUE 表示没有透明度。

TRANSLUCENT 表示每个像素的Alpha值介于0和1之间。

BITMASK 表示每个像素都是不透明的或完全透明的。

我可以使用getTransparency()方法检查此值。就我而言,我有一个透明的PNG文件:

pic = ImageIO.read(new File(filename));
int transparency = pic.getTransparency(); // returns Transparency.TRANSLUCENT

现在我读到使用Transparency.BITMASK的图像可以比使用Transparency.TRANSLUCENT的图像快得多,在我的情况下BITMASK就足够了。我只是为一种特定颜色的所有透明像素着色,然后保存png而不透明。

问题:如何通过将一种颜色定义为透明来创建BufferedImage对象,该对象具有来自现有BufferedImage的Transparency.BITMASK?

2 个答案:

答案 0 :(得分:2)

你的意思是......

// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();

BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);

注意事项:

  • 如果您的PNG包含alpha值> 0和< 255,它们很可能被舍入为0或1,可能使PNG看起来呈锯齿状......
  • 如果您使用Transparency.TRANSLUCENTBufferedImage的颜色模式将与GraphicsDevice兼容,从而加快呈现速度
几年前我做了一个动画序列,它由5个单独的图像组成,彼此叠加并以透明窗口顶部的不同速度播放...当我第一次尝试运行时,播放很可怕,跳到了这个地方。

在玩了一些游戏之后,我发现使用Transparency.TRANSLUCENT将图像转换为GraphicsDevice的兼容颜色模型就像魅力......

答案 1 :(得分:1)

接受的答案没有错,只提供完整性的替代方案(我认为它将在无头模式下工作)。 : - )

BufferedImage的透明度由其ColorModel控制。

因此,要创建具有给定BufferedImage常量的Transparency,您可以使用以下代码:

// Use default RGB color space, no discrete alpha channel, 
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel colorModel = new ComponentColorModel(cs, true, false, Transparency.BITMASK, DataBuffer.TYPE_BYTE);

WritableRaster raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, w, h, 4, null);

BufferedImage image = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null);