如何连续淡化BitmapData到某种颜色?

时间:2009-10-11 05:23:46

标签: actionscript-3 colors bitmapdata colormatrix color-palette

我在bitmapData上绘制东西,我需要在绘制时将每个像素连续淡入0x808080(它用于DisplacementMapFilter)... 我认为这说明了我的问题:
http://www.ventdaval.com/lab/grey.swf

我尝试的更简单的方法是在其上绘制一个半透明的灰色框,但它永远不会达到单一颜色(即0x808081永远不会转为0x808080)...同样的事情发生在ColorMatrixFilter尝试逐渐降低饱和度和/或对比度。 (上面的示例是应用每帧-10对比度的滤镜。)

我现在正在尝试使用paletteMap,我感觉这可能是要走的路,但我无法得到它...任何想法?

3 个答案:

答案 0 :(得分:1)

你现在可以尝试淡化它,而不是现在淡出它,所以颜色会变为0x808080,你只需要做一些计算。

是的,您可以使用paletteMap执行此操作。 第三种方法是为它编写PixelBender着色器。 您也可以使用普通的淡入淡出,并在几帧内完成一次paletteMap或PixelBender,以加快这一切。

答案 1 :(得分:1)

我认为最简单的方法是使用两个连续的彩色滤镜。那就是:

var n:Number = 0.9;
var off:Number = 0x80;
var filter:ColorMatrixFilter = new ColorMatrixFilter( [
        1, 0, 0, 0, -off, 
        0, 1, 0, 0, -off, 
        0, 0, 1, 0, -off, 
        0, 0, 0, 1, -off ] );
var filter2:ColorMatrixFilter = new ColorMatrixFilter( [
        n, 0, 0, 0, off, 
        0, n, 0, 0, off, 
        0, 0, n, 0, off, 
        0, 0, 0, n, off ] );

function onFrame( e:Event ) {
    myBMD.applyFilter( myBMD, myBMD.rect, new Point(), filter );
    myBMD.applyFilter( myBMD, myBMD.rect, new Point(), filter2 );
}

第一个滤镜将每个通道值向下偏移128 - 将基于灰色的图像转换为基于黑色的图像。第二个滤波器将每个通道值乘以调制器(在我的示例中为0.9),然后将值向上偏移128.

答案 2 :(得分:1)

我通过每帧用0xFF808080填充纹理来解决这个问题,然后将我的动态内容绘制到第二个透明位图,使用较低的alpha乘数(比如0.98)对其进行colortransform,然后将该位图复制到mergealpha on的主位图。是一种享受:

public function update():void 
        {
            lock(); 
            fillRect(rect, 0xFF808080);

            drawTarget.lock();
            drawTarget.colorTransform(rect, fadeTransform);
            drawTarget.applyFilter(drawTarget, rect, pt, blurFilter); 
            drawTarget.unlock();

            copyPixels(drawTarget, rect, pt, null, null, true);
            unlock();
        }