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?
答案 0 :(得分:2)
你的意思是......
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
注意事项:
Transparency.TRANSLUCENT
,BufferedImage
的颜色模式将与GraphicsDevice
兼容,从而加快呈现速度在玩了一些游戏之后,我发现使用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);