BufferedImage类实现透明,它有三个值:
不透明的意味着没有透明度。
半透明意味着每个像素的阿尔法值介于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创建具有Transparency.BITMASK的BufferedImage对象?
发布于 2014-11-30 20:46:01
你的意思是像..。
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);要注意的事情:
Transparency.TRANSLUCENT,则BufferedImage的颜色模式将与GraphicsDevice兼容,从而使呈现速度更快。几年前,我制作了一个动画序列,它由5幅不同的图片组成,彼此层叠,在透明的window...When上以不同的速度回放--我第一次试着运行它,回放很糟糕,在这个地方跳来跳去。
在玩了一段时间后,我发现使用Transparency.TRANSLUCENT将图像转换成兼容的GraphicsDevice颜色模型就像一种魅力……
发布于 2014-12-02 18:14:44
接受的答案没有什么问题,只是提供了一个完整的替代方案(我认为它将在无头模式下工作)。:-)
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);https://stackoverflow.com/questions/27217319
复制相似问题