【问题标题】:Get dominant or average color in getPixels ByteArray在 getPixels ByteArray 中获取主要颜色或平均颜色
【发布时间】:2010-01-10 13:40:27
【问题描述】:

所以,我得到了这个代码:

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.utils.ByteArray;

var bmd:BitmapData = new BitmapData(10, 10, true);
var seed:int = int(Math.random() * int.MAX_VALUE);
bmd.noise(seed);

var bounds:Rectangle = new Rectangle(0, 0, bmd.width, bmd.height);
var pixels:ByteArray = bmd.getPixels(bounds);

有没有一种方法可以高效、快速地获取pixelsByteArray 中的主色和/或平均色。

noise 用于此处的示例。我将在该 BitmapData 上绘制其他内容。

我找到了一些方法来从 BitmapData 中提取平均色觉,但这对我来说还不够,因为我想要从该图像的矩形中提取平均值。

提前致谢!

【问题讨论】:

    标签: flash actionscript-3 actionscript


    【解决方案1】:

    平均颜色很容易,只需将bitmapData 调整为draw() 的大小为1x1 位图,flash 将在复制过程中平均颜色。

    var m: Matrix = new Matrix();
    m.scale( 1 / bmd.width, 1 / bmd.height);
    var averageColorBmd:BitmapData = new BitmapData(1, 1);
    averageColorBmd.draw(bmd, m);
    var averageColor:uint = averageColorBmd.getPixel(0,0);
    

    类似的东西!

    【讨论】:

    • 不错的把戏。您可以通过为子图像创建新的 BitmapData 并复制像素 (BitmapData.copyPixels) 将其限制为矩形。
    • +1 感谢您的建议!我认为这将是处理密集型的。我正在寻找某种“更快”的解决方案,不需要一些重绘过程......
    • 实际上,draw 是经过优化的,因为它是 Flash 渲染引擎的一部分。我不认为你会发现任何更快考虑到每个像素的东西。
    • 我猜你在大面积像素方面是对的。在我的特殊情况下,我有 10x10 的小区域,我只想检查该框内是否存在颜色,所以我发现读取中间像素的 getPixel 信息就足够了。还是谢谢!
    【解决方案2】:

    仅供参考,这实际上并没有平均或选择主色。

    这样做是依靠闪存将图像缩小到一个像素,然后决定使用哪种颜色。我不确定这种颜色是如何选择的,但通过测试它不是平均颜色,也不是主要颜色。

    【讨论】:

    • 我同意。当我需要这样做时,我通常将其缩小为 3x3 图像并取中间像素。结果通常要好得多
    猜你喜欢
    • 2011-07-06
    • 2011-07-09
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多