我正在开发一款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构造函数填充白色。我用透明像素填充它。见下面的答案。
答案 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;