2009-10-11 95 views
0

我画上一个位图数据的东西,我需要每个像素不断褪色0x808080,同时还绘制(其为DisplacementMapFilter)... 我觉得这说明我的问题:
http://www.ventdaval.com/lab/grey.swf如何连续淡入淡出BitmapData到某种颜色?

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

我想现在paletteMap,我感觉这可能是要走的路,但我一直无法得到它......任何想法?

回答

1

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

是的,你可以用paletteMap来做到这一点。 第三种方法是为它编写PixelBender着色器。 您也可以使用正常的渐变,并在几帧中执行paletteMap或PixelBender一次,以加速所有这些。

+0

感谢您的答案,但计算告诉我,我需要褪色超过50%,才能使0x808081像素成为0x808080。 我结束了使用合并和玩alpha通道,哪种工作,但我无法得到它完美,然后我用尽了时间继续试图与PixelBender或paletteMap,顺便说一句,我仍然无法理解如何确切地使用...如果你有任何好的参考将是伟大的:) – Cay 2009-11-30 01:12:41

+0

没错。你需要褪色超过50%(如果你想要的话,几乎不会褪色)。 http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html#paletteMap() - 我使用的唯一参考是这一个。 – stroncium 2009-12-01 20:57:16

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.

+1

顺便说一句,我做了一个快速测试,这似乎没有任何舍入问题。如果它适合你,你总是可以在第一个过滤器中使用比第二个过滤器略大的偏移量,这会强制所有值收敛到0x80。 – fenomas 2010-04-04 08:01:41

+0

这不是一个坏主意,但同样的问题出现了...尝试添加到您的代码: var myBMD:BitmapData = new BitmapData(2,2,false,0); myBMD.noise(2); (var i:uint = 0; i <30; i ++){ trace(myBMD.getPixel(1,1).toString(16)); \t onFrame(null); } 注意最后10个值是相同的(848084),当它们应该不断变化,最终达到808080.请看我的意思吗? :S – Cay 2010-04-05 20:12:16

+0

Cay:阅读你上面的评论。换句话说,在第一个过滤器中将“-off”更改为“-off-1”。 – fenomas 2010-04-06 00:33:46

1

我解决了这个问题,每帧填充纹理0xFF808080,然后绘制我的动态内容到另一个透明的位图,用一个较低的alpha乘数(比如0.98)对它进行colortransform,然后将该位图copypixeling到带有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(); 
     }