2014-02-27 82 views
1

我试图优化Java中的渲染引擎,以便不绘制被其前面绘制的“实体”子对象遮盖的对象,即父级被其子级遮挡。检测BufferedImage是否包含透明像素

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

我发现我可以使用BufferedImage.getColorModel()。hasAlpha()来查找图像是否支持alpha,但是在这种情况下,它不会告诉我它是否包含非不透明像素。

我知道我可以遍历所有的像素数据&测试每个人的alpha值&当我发现一个非不透明像素回来,但我想知道是否已经存在一些天然的,我可以使用,即设置一个标志内部也许?或者比迭代像素少一点。

任何输入赞赏,谢谢。

+4

很确定您需要遍历每个像素并检查Alpha值。抱歉。 – wattostudios

回答

1

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

如果您不需要100%确定,您当然可以测试一些像素,您认为透明度最有可能发生。

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

不幸的是,我不认为在最常见的情况之一有一个优化,即颜色模型允许透明度,但实际上没有透明像素的情况下......您确实需要在这种情况下测试每个像素,以确定地知道。

访问在它的“本地表示”α值(通过Raster/DataBuffer/SampleModel班)将是比使用BufferedImage.getRGB(x, y)更快,屏蔽掉alpha值。

1

我敢肯定,你需要遍历每个像素并检查Alpha值。

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