【问题标题】:How to continuously fade a BitmapData to a certain color?如何将 BitmapData 连续淡化为某种颜色?
【发布时间】:2013-01-25 07:03:02
【问题描述】:

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

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

我现在正在尝试paletteMap,我感觉这可能是要走的路,但我没能得到它……有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以尝试将其淡化比现在淡化它稍微多一点,因此颜色将变为 0x808080,您只需要进行一些计算即可。

    是的,您可以使用paletteMap 做到这一点。 第三种方法是为其编写 PixelBender 着色器。 您也可以使用正常的淡入淡出并在几帧中执行一次paletteMap 或 PixelBender,以加快这一切。

    【讨论】:

    • 感谢您的回答,但计算告诉我,我需要褪色超过 50% 才能将 0x808081 像素变为 0x808080。我最终使用了合并并使用了 alpha 通道,这很有效,但我无法让它完美,然后我没有时间继续尝试使用 PixelBender 或调色板地图,顺便说一句,我仍然不明白如何完全使用......如果你有任何好的参考会很棒:)
    • 没错。你需要褪色超过 50%(如果你愿意,可以褪色几次)。 livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/… - 我使用的唯一参考是这个。
    【解决方案2】:

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

    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。

    【讨论】:

    • 顺便说一下,我做了一个快速测试,这似乎没有任何舍入问题。如果它适合您,您总是可以在第一个过滤器中使用比第二个过滤器稍大的偏移量,这应该会强制所有值精确地收敛到 0x80。
    • 这不是一个坏主意,但会出现同样的问题...尝试将其添加到您的代码中: var myBMD:BitmapData=new BitmapData(2,2,false,0); myBMD.noise(2); for (var i:uint=0;i
    • Cay:请阅读您上面的评论。换句话说,在第一个过滤器中将“-off”更改为“-off-1”。
    • 哦,你说得对,我一开始没听懂,抱歉……不过,我丢失了所有低于 0x808080 的颜色信息,实际上我需要整个范围(为了能够得到负位移):(
    【解决方案3】:

    我解决了这个问题,每帧用 0xFF808080 填充纹理,然后将我的动态内容绘制到第二个透明位图,使用较低的 alpha 乘数(比如 0.98)对其进行颜色变换,然后将该位图复制到带有 mergealpha 的主位图。工作一种享受:

    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();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多