1

我正在开发一个 Flash 应用程序,该应用程序将显示由各种 PNG 制作的具有透明度的 MovieClip。PNG 需要在运行时进行颜色校正,以使亮度级别保持一致。为此,我编写了使用 MovieClip 的平均亮度级别来确定图像变亮或变暗的代码。有人慷慨地给了我代码来计算 Adob​​e 论坛上的平均亮度:http ://forums.adobe.com/message/3501572

这种使用直方图的方法非常有效,除非影片剪辑具有透明区域。MovieClip 中的任何透明像素都会读取为纯白色并扭曲结果。

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

编辑:

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

4

1 回答 1

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;
于 2012-07-13T20:25:09.980 回答