【问题标题】:Detecting if a BufferedImage contains transparent pixels检测 BufferedImage 是否包含透明像素
【发布时间】:2014-03-30 21:56:08
【问题描述】:

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

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

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

我知道我可以遍历像素数据并测试每个像素的 alpha 值并在发现非透明像素后立即返回,但我想知道是否已经有可以使用的原生东西,即内部设置的标志可能?或者比通过像素迭代更不密集的东西。

任何意见表示赞赏,谢谢。

【问题讨论】:

  • 非常确定您需要遍历每个像素并检查 Alpha 值。对不起。

标签: java image bufferedimage raster alpha-transparency


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 2012-11-14
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多