Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建具有位掩码透明度的BuffereImage?_Java_Png_Transparency_Bufferedimage_Bitmask - Fatal编程技术网

Java 如何创建具有位掩码透明度的BuffereImage?

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

BuffereImage类实现透明度,它有三个值:

不透明表示没有透明度

半透明表示每个像素的Alpha值在0到1之间

位掩码表示每个像素要么不透明,要么完全透明

我可以用getTransparency()方法检查这个值。在我的例子中,我有一个透明的PNG文件:

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,则
    缓冲图像
    的颜色模式将与
    图形设备
    兼容,从而加快渲染速度
几年前,我做了一个动画序列,由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
将图像转换为与
图形设备兼容的颜色模型效果非常好…

你的意思是

// 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
控制

因此,要创建具有给定透明度常数的
缓冲图像
,可以使用如下代码