检测BufferedImage是否包含透明像素

时间:2014-02-27 12:50:10

标签: java image bufferedimage raster alpha-transparency

我正在尝试优化Java中的渲染引擎,以便不绘制被在其前面绘制的“实体”子对象所覆盖的对象,即父级被其子级遮挡。

我想知道从文件加载的任意BufferedImage是否包含任何透明像素 - 因为这会影响我的遮挡测试。

我发现我可以使用BufferedImage.getColorModel()。hasAlpha()来查找图像是否支持alpha,但是如果它支持alpha,它不会告诉我它是否肯定包含非不透明像素。

我知道我可以遍历像素数据&测试每个人的alpha值&我发现一个非不透明的像素后立即返回,但我想知道是否已经存在我可以使用的原生内容,也许是内部设置的标志?或者比迭代像素更不强烈的东西。

感谢任何意见,谢谢。

2 个答案:

答案 0 :(得分:1)

不幸的是,您必须循环遍历每个像素(直到找到透明像素)才能确定。

如果你不需要百分百肯定,你当然可以只测试一些像素,你认为透明度最有可能发生。

通过查看各种图像,我认为您会发现大多数具有透明部分的图像都包含沿边缘的透明度。这种优化将有助于许多常见情况。

不幸的是,我不认为可以在最常见的情况之一中进行优化,颜色模型允许透明,但实际上没有透明像素......你真的需要测试在这种情况下,每个像素都要确定。

以“本地表示”(通过Raster / DataBuffer / SampleModel类)访问Alpha值比使用BufferedImage.getRGB(x, y)并屏蔽掉更快阿尔法值。

答案 1 :(得分:1)

我很确定你需要遍历每个像素并检查Alpha值。

我能提供的最佳选择是编写一种自定义方法来读取像素数据 - 即您自己的Raster。在此类中,当您将源文件中的像素数据读入数据缓冲区时,可以随时检查alpha值。当然,如果您使用内置的图像阅读课程,这并没有多大帮助,并且需要付出更多努力。