【问题标题】:Check the average brightness of a MovieClip (ignoring transparency)?检查影片剪辑的平均亮度(忽略透明度)?
【发布时间】:2012-07-13 00:05:10
【问题描述】:

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

【问题讨论】:

  • 你的问题解决了吗??如果是,请将解决方案放在答案块中,甚至您也可以接受自己。这样社区就可以知道,这个问题已经解决了,回答也会对其他人有所帮助。
  • 新用户不能马上回答他们自己的问题,所以我没有。我现在就试试。

标签: actionscript-3 flash


【解决方案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-08-23
    • 2016-05-23
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多