【问题标题】:AS3 - Find the most abundant pixel colour in BitmapDataAS3 - 在 BitmapData 中查找最丰富的像素颜色
【发布时间】:2013-01-17 21:08:22
【问题描述】:

基本上,我想获得出现在BitmapData 中的最常见的 ARGB 值。也就是想知道图片中哪个exact像素颜色最丰富。我尝试遍历图像的每个像素,并在出现已经存在的颜色时进行计数,但这太慢了,即使图像相对较小。有没有人知道一个更快的方法,也许使用BitmapData.histogram() 函数或其他东西?

理想情况下,对于至少 1000x1000 像素左右的图像,该过程应该接近瞬时。

【问题讨论】:

  • 我发现了一个类似的问题,有一个很好的答案,它可能对你有帮助stackoverflow.com/a/9879812/1123633
  • 我已经看到:不幸的是,解决方案似乎找到了平均颜色,这不是我想要的。我正在寻找图像中出现次数最多的单一颜色值。就像如果你有 20 个像素是 0xFF89ae00 和 10 个像素是 0xFFae0089,我会得到的结果颜色是 0xFF89ae00,因为这是大多数像素的颜色。
  • 哦,好吧,我误解了答案(我链接的那个),对不起^^。
  • 你使用的是getPixel()还是getVector()
  • 我用的是getPixel32():现在我看到getVector()更适合这个用途,但在Vesper回答之前我没用过。

标签: actionscript-3 colors bitmapdata argb


【解决方案1】:

使用字典运行bitmapData.getVector() 以保存数字,然后按值对该字典的键值对进行排序并获得最大值的键。

var v:Vector.<uint>=yourBitmapData.getVector(yourBitmapData.rect);
var d:Dictionary=new Dictionary();
for (var i:int=v.length-1; i>=0;i--) {
    if (d[v[i]]) d[v[i]]++; else d[v[i]]=1;
}
var maxkey:String=v[0].toString();
var maxval:int=0;
for (var k:String in d) {
    if (d[k]>maxval) {
        maxval=d[k];
        maxkey=k;
    }
}
return parseInt(maxkey); // or just maxkey

【讨论】:

  • 谢谢,这很好用(我不确定你为什么要向后迭代Vector,但对我来说很好用)。不幸的是,它仍然比我需要的慢(尽管它比较快)。如果可能的话,我将不回答这个问题,看看是否有人知道更快的事情。如果接下来一两天没有任何答案,我会接受这个。
  • 我希望没有什么比这更快了,因为您需要查询每个像素并制作精确的颜色直方图,这需要完整的迭代。为什么向后 - 我们不需要保持顺序来计数,但是如果我们向前走,我们会不断检查向量长度,它不如检查零快。
  • 啊,好点,没想到。当订单无关紧要时,我一定会记住这一点。很可能您是对的,这可能是具有这种准确度的最快方法,但不妨看看是否会出现一些神奇的事情。
  • @puggsoy 将长度保存在局部变量中同样容易。我经常这样做:var lng:uint = myArray.length; for(var i:uint = 0; i &lt; lng; i++) {... }
【解决方案2】:

我根本没有使用过着色器,但我认为您可能能够获得更快的结果。在着色器级别循环通过像素更快。

我会尝试在着色器中创建基本相同的循环,并使用最常用的颜色和样本绘制整个生成的位图(除非您可以直接从着色器中获取变量)

这应该会更快

【讨论】:

  • 我会试一试的。不过,我之前从未与Shaders 合作过,而且他们看起来不像你的普通班级,所以我必须调查一下。
  • 不是flash中的shader不支持循环吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多