有没有办法在使用 bitmapdata.floodfill 方法填充的位图中查找区域的大小?

Posted

技术标签:

【中文标题】有没有办法在使用 bitmapdata.floodfill 方法填充的位图中查找区域的大小?【英文标题】:Is there a way to find the size of the area in a bitmap which has been filled using the bitmapdata.floodfill method? 【发布时间】:2011-09-27 06:16:08 【问题描述】:

基本上,我使用 Floodfill 方法对位图图像的各个部分进行着色。这部分很简单,但问题在于我向颜色填充例程添加效果的方式。

要添加效果,首先创建位图数据的副本,并在其上使用填充而不是原始位图。然后使用 bitmapdata.compare 方法将除填充部分之外的所有内容的 alpha 值设置为 0,并将结果保存在另一个 bitmapdata 中。之后,一个 1 px 半径的圆形精灵被添加到舞台上,并被补间到图像尺寸,并且它的掩码被设置为包含比较操作结果的精灵。

这非常有效,除了填充精灵必须补间到完整的图像尺寸,无论该区域被着色有多小,因为我无法找到获得填充尺寸的方法区域。我在补间结束时进行位图图像更新,我必须禁用用户交互,直到补间完成以避免在基础图像更新之前启动另一个填充操作时出现的错误。如果我能以某种方式获得填充区域的尺寸,那么我必须禁用用户交互的时间将会大大减少。

有什么想法吗?

【问题讨论】:

【参考方案1】:

getColorBoundsRect 呢?我不知道您的填充颜色是否会出现在位图的其他部分,但它可能会起作用。

【讨论】:

完美!那成功了。最初它让我有点困扰,因为当它需要 ARGB 格式的掩码和颜色值时,我一直在尝试使用 RGB 颜色值。一旦它被修复,它就像一个魅力。 :)【参考方案2】:

我认为getColorBoundsRect 正是您所需要的。您选择一种颜色并在位图中获取该颜色的边界框。

【讨论】:

是的。多亏了你和 frankhermes 的评论,我才免于尝试奇怪的 hackjobs 只是为了让这件事发挥作用。 :)【参考方案3】:

编写您自己的填充例程。填写像素时,存储您需要的尺寸信息。最简单的方法是只存储边界框。您通过找到适当颜色的相邻像素来填充,并且任何时候这样的移动使您离开工作边界框,进行调整。

更复杂的可以存储位图。无论您选择哪种方式,关键是您可以更轻松地获得您需要的东西,而不是解决非设计目标。

【讨论】:

我让它与 getColorBoundsRect 一起工作,但我对你的建议很感兴趣。问题是您的方法要求我事先知道边界框,而这是我首先需要知道的。此外,内置的位图数据操作方法比我可能想出的任何自定义方法都要快得多,所以我不确定即使我能想出一些可行的方法,它是否能通过性能测试。 这种方法的最大问题当然是您现在扫描像素两次。我评论的重点是 API 没有在同一个算法中提供这两种功能,因此任何不使用您自己的例程的方法都必须使用两个像素扫描 API,从而使性能降低 2 倍。如果这是可以接受的,那么使用现有代码而不是调试和优化您自己的代码当然很好。 @localhost:在边界框上,您不需要预先设置。您从一个像素大小的边界框开始,围绕您开始的像素。随着填充区域的增长,边界框也随之增长。至于能不能超越原生例程,全看你的约束。有很多方法可以优化。在 AS3 中,您将从每个生长区域的 GetPixels 开始(根据需要添加矩形)。如果数组访问速度很慢,abcsx 可用于手动优化。 PixelBender 着色器提供更快的遍历。可以测试炼金术以获得更好的性能。 Hm.. 你确实有一点关于使用该方法扫描像素两次但由于内置的​​位图数据操作非常快,这并不会真正影响性能,至少与方法相比我可能会在 AS3 中编写(尽管如果洪水填充返回填充区域的绑定矩形会很好)。无论如何,这就是我的感觉,但我会试一试,看看在实际测试中结果如何。一段时间以来,我一直想尝试炼金术,这可能正是我摆脱困境并修补它所需要的。

以上是关于有没有办法在使用 bitmapdata.floodfill 方法填充的位图中查找区域的大小?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 PrimeReact 树中使用自定义图标?

有没有办法使用 flexbox 语法将 div 堆叠在一起?

[JavaScript]有没有办法在没有终端的情况下使用 Cloudinary

有没有办法在 Perl 中使用“常量”作为哈希键?

有没有办法在 XAMPP 中使用两个 PHP 版本?

有没有办法在 codesandbox.io 中使用 npm 脚本?