Actionscript 3 检查电影剪辑的平均亮度(忽略透明度)?

Actionscript 3 检查电影剪辑的平均亮度(忽略透明度)?,actionscript-3,flash,Actionscript 3,Flash,我正在开发一个Flash应用程序,它将显示由各种PNG制成的透明电影嘴唇。PNG需要在运行时进行颜色校正,以使其亮度一致。为了实现这一点,我编写了一段代码,使用MovieClip的平均亮度级别来确定图像的亮度。有人亲切地给了我计算Adobe论坛平均亮度的代码: 这种使用直方图的方法非常有效,除非MovieClip具有透明区域。MovieClip中的任何透明像素都会显示为纯白色并扭曲结果 有人知道更好的方法吗?我需要一个准确的结果;我记得我尝试过一些古怪的事情,比如将电影剪辑缩小到1像素,然后读取

我正在开发一个Flash应用程序,它将显示由各种PNG制成的透明电影嘴唇。PNG需要在运行时进行颜色校正,以使其亮度一致。为了实现这一点,我编写了一段代码,使用MovieClip的平均亮度级别来确定图像的亮度。有人亲切地给了我计算Adobe论坛平均亮度的代码:

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

有人知道更好的方法吗?我需要一个准确的结果;我记得我尝试过一些古怪的事情,比如将电影剪辑缩小到1像素,然后读取该像素的颜色,但这并不有效

编辑:

啊哈!我终于从中找到了答案。默认的BitmapData构造函数填充为白色。我用透明像素代替了它。参见下面的答案。

var bmp:BitmapData=新的BitmapData(image.width/4,image.height/4,true,0x00000000);
        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;
bmp.draw(图像); bmp.draw(image.getChildAt(0)); 变量v:向量bmp.histogram(); 变量r:数值=0; 变量g:数值=0; 变量b:数值=0; 变量a:数值=0; 对于(var i:uint=0;i
var bmp:BitmapData=new-BitmapData(image.width/4,image.height/4,true,0x00000000);
bmp.draw(图像);
bmp.draw(image.getChildAt(0));
var v:Vector.=bmp.histogram();
变量r:数值=0;
变量g:数值=0;
变量b:数值=0;
变量a:数值=0;

对于(var i:uint=0;我知道你解决了你的问题吗?如果是的话,请把解决方案放在回答栏中,甚至你也可以接受它自己。这样社区就可以知道,这个问题已经解决了,答案也会对其他人有帮助。新用户不能立即回答他们自己的问题,所以我没有回答。我现在就试试。你解决了你的问题吗?如果是的话请将解决方案放在答案栏中,即使你们也可以接受它自己。这样社区就可以知道,这个问题已经解决了,答案也会对其他人有帮助。新用户不能立即回答他们自己的问题,所以我没有回答。我现在就试试。