Java 如何创建具有位掩码透明度的BuffereImage?
BuffereImage类实现透明度,它有三个值: 不透明表示没有透明度 半透明表示每个像素的Alpha值在0到1之间 位掩码表示每个像素要么不透明,要么完全透明 我可以用getTransparency()方法检查这个值。在我的例子中,我有一个透明的PNG文件:Java 如何创建具有位掩码透明度的BuffereImage?,java,png,transparency,bufferedimage,bitmask,Java,Png,Transparency,Bufferedimage,Bitmask,BuffereImage类实现透明度,它有三个值: 不透明表示没有透明度 半透明表示每个像素的Alpha值在0到1之间 位掩码表示每个像素要么不透明,要么完全透明 我可以用getTransparency()方法检查这个值。在我的例子中,我有一个透明的PNG文件: pic = ImageIO.read(new File(filename)); int transparency = pic.getTransparency(); // returns Transparency.TRANSLUCENT
pic = ImageIO.read(new File(filename));
int transparency = pic.getTransparency(); // returns Transparency.TRANSLUCENT
现在我读到,使用Transparency.BITMASK的图像可以比使用Transparency.Transparency.BITMASK的图像绘制得快得多,就我而言,使用Transparency.Transparency和BITMASK就足够了。我只需将所有透明像素涂成一种特定的颜色,然后保存png而不使用透明度
问题:如何通过将一种颜色定义为透明,从现有BuffereImage创建一个具有Transparency.BITMASK的BuffereImage对象?您的意思是
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
注意事项:
- 如果PNG包含大于0和小于255的alpha值,则它们可能被舍入为0或1,这可能会使PNG呈现锯齿状
- 如果改用透明.Transparency,则
的颜色模式将与缓冲图像
兼容,从而加快渲染速度图形设备
经过一番尝试后,我发现使用
Transparency.Transparency
将图像转换为与图形设备兼容的颜色模型效果非常好…你的意思是
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
注意事项:
- 如果PNG包含大于0和小于255的alpha值,则它们可能被舍入为0或1,这可能会使PNG呈现锯齿状
- 如果改用透明.Transparency
,则缓冲图像
的颜色模式将与图形设备
兼容,从而加快渲染速度
几年前,我做了一个动画序列,由5个独立的图像组成,层叠在一起,以不同的速度在一个透明的窗口上播放……当我第一次尝试运行它时,播放效果很糟糕,到处乱跳
经过一番尝试后,我发现使用
Transparency.Transparency
将图像转换为与图形设备兼容的颜色模型效果非常好…你的意思是
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
注意事项:
- 如果PNG包含大于0和小于255的alpha值,则它们可能被舍入为0或1,这可能会使PNG呈现锯齿状
- 如果改用透明.Transparency
,则缓冲图像
的颜色模式将与图形设备
兼容,从而加快渲染速度
几年前,我做了一个动画序列,由5个独立的图像组成,层叠在一起,以不同的速度在一个透明的窗口上播放……当我第一次尝试运行它时,播放效果很糟糕,到处乱跳
经过一番尝试后,我发现使用
Transparency.Transparency
将图像转换为与图形设备兼容的颜色模型效果非常好…你的意思是
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage bimage = gc.createCompatibleImage(width, height, Transparency.BITMASK);
注意事项:
- 如果PNG包含大于0和小于255的alpha值,则它们可能被舍入为0或1,这可能会使PNG呈现锯齿状
- 如果改用透明.Transparency
,则缓冲图像
的颜色模式将与图形设备
兼容,从而加快渲染速度
几年前,我做了一个动画序列,由5个独立的图像组成,层叠在一起,以不同的速度在一个透明的窗口上播放……当我第一次尝试运行它时,播放效果很糟糕,到处乱跳
经过一番尝试,我发现使用
Transparency.Transparency
将图像转换为与GraphicsDevice
兼容的颜色模型,效果非常好……接受的答案没有错,只是提供了一个完整性的替代方案(我认为它可以在无头模式下工作)。:-)
buffereImage
的透明度由其ColorModel
控制
因此,要使用给定的透明度
常量创建缓冲图像
,可以使用如下代码:
// 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);
接受的答案没有问题,只是提供了一个完整性的替代方案(我认为它将在无头模式下工作)。:-)
buffereImage
的透明度由其ColorModel
控制
因此,要使用给定的透明度
常量创建缓冲图像
,可以使用如下代码:
// 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);
接受的答案没有问题,只是提供了一个完整性的替代方案(我认为它将在无头模式下工作)。:-)
buffereImage
的透明度由其ColorModel
控制
因此,要使用给定的透明度
常量创建缓冲图像
,可以使用如下代码:
// 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);
接受的答案没有问题,只是提供了一个完整性的替代方案(我认为它将在无头模式下工作)。:-)
buffereImage
的透明度由其ColorModel
控制
因此,要创建具有给定透明度常数的缓冲图像
,可以使用如下代码