繁体   English   中英

检测BufferedImage是否包含透明像素

[英]Detecting if a BufferedImage contains transparent pixels

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

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

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

我知道我可以遍历像素数据并测试每个像素的Alpha值并在发现不透明像素后立即返回,但是我想知道是否已经可以使用本机的某个东西,也许是在内部设置的标志? 或强度比遍历像素少一些的东西。

任何输入表示赞赏,谢谢。

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

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

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

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

(通过Raster / DataBuffer / SampleModel类)访问其“本机表示形式”中的alpha值将比使用BufferedImage.getRGB(x, y)并屏蔽掉alpha值更快。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM