检查MovieClip的平均亮度(忽略透明度)?

时间:2012-07-13 00:05:11

标签: actionscript-3 flash

我正在开发一款Flash应用,可以显示由各种PNG制作的具有透明度的MovieClip。 PNG需要在运行时进行颜色校正,以使亮度水平均匀。为了实现这一点,我编写了一些代码,该代码使用MovieClip的平均亮度级别来确定使图像变亮或变暗的程度。有人慷慨地给了我代码来计算Adobe论坛的平均亮度:http://forums.adobe.com/message/3501572

使用直方图的方法非常有效,除非MovieClip具有透明区域。 MovieClip中的任何透明像素都显示为纯白色并使结果倾斜。

有谁知道更好的方法吗?我需要一个准确的结果;我记得尝试过古怪的事情,例如将MovieClip缩放到1个像素并读取该像素的颜色,但这并没有效果。

编辑:

AHAH!我终于从http://www.kirupa.com/forum/showthread.php?266493-Extract-Bitmap-or-BitmapData-from-MovieClip找到了它。默认的BitmapData构造函数填充白色。我用透明像素填充它。见下面的答案。

1 个答案:

答案 0 :(得分:1)

        var bmp:BitmapData = new BitmapData(image.width/4,image.height/4, true, 0x00000000);
        bmp.draw(image);
        bmp.draw(image.getChildAt(0));
        var v:Vector.<Vector.<Number >  >  = bmp.histogram();
        var r:Number = 0;
        var g:Number = 0;
        var b:Number = 0;
        var a:Number = 0;

        for (var i:uint=0; i<256; i++) {
            r +=  i * v[0][i] / 255;
            g +=  i * v[1][i] / 255;
            b +=  i * v[2][i] / 255;
            a += i*v[3][i]/255;

        }
        var totalPixels:uint = bmp.rect.width * bmp.rect.height;
        r /=  totalPixels;
        g /=  totalPixels;
        b /=  totalPixels;
        a /= totalPixels;

        var brightness:Number = (r+g+b)/3;
        bmp.dispose();
        return brightness * 2;