2011-05-02 178 views
2

我需要动态地使用ActionScript 3.0为灰度渐变位图着色。渐变从白到黑,最深的颜色必须是0xFF0000,最轻的是0xFFFFFF。尝试调色板图和ColorMatrixFilter混合结果并没有稳定的解决方案。着色灰度图像as3

回答

1

通过在红色通道上构建一个具有255偏移量的矩阵(除此之外是一个单位矩阵),可能对ColorMatrixFilter非常有用。

此示例文档类假定FLA库中有一个720×480的输出符号“GradientBMD”这是一个flash.display.BitmapData子类:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.geom.Point; 
    import flash.filters.*; 

    public class GreyscaleDemo extends Sprite 
    { 
     public function GreyscaleDemo() 
     { 
      var bmd:BitmapData = new GradientBMD(720,480); 

      var matrix:Array = new Array(); 
      matrix = matrix.concat([1,0,0,0,255]); 
      matrix = matrix.concat([0,1,0,0,0]); 
      matrix = matrix.concat([0,0,1,0,0]); 
      matrix = matrix.concat([0,0,0,1,0]); 

      var colorFilter:ColorMatrixFilter = new ColorMatrixFilter(matrix); 
      bmd.applyFilter(bmd, bmd.rect, new Point(0,0), colorFilter); 

      var bitmap:Bitmap = new Bitmap(bmd); 
      this.addChild(bitmap); 
     } 
    } 
} 

您还可以创建充满颜色的新位图数据你想要的梯度递减至(代替黑色),并将其复制到您的梯度BlendMode.ADD:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BlendMode; 
    import flash.geom.Point; 

    public class GreyscaleDemo extends Sprite 
    { 
     public function GreyscaleDemo() 
     { 
      var bmd:BitmapData = new GradientBMD(720,480); 
      var bitmap:Bitmap = new Bitmap(bmd); 
      this.addChild(bitmap); 

      var bmd2:BitmapData = new BitmapData(720, 480, false, 0xFF0000); 
      bmd.draw(bmd2, null, null, BlendMode.ADD, bmd.rect,false); 
     } 
    } 
} 
+0

在的ColorMatrixFilter例子,我特别套管它为红色。很明显,您可以通过设置每个通道的偏移量将渐变色调为任意RGBA颜色。我将滤镜解决方案移到了我的响应的顶部,因为如果您将图像着色为纯色,这是最好的方法。如果色彩以某种方式不均匀(即,您有第二个色调位图应用),则可以使用第二种解决方案。 – 2011-05-02 21:34:03

+0

谢谢!由于我处理很多透明胶片ColorMatrix滤镜效果最佳。在下面发布我的最终解决方案 - 适用于彩色和灰度图像。 – 2011-05-03 15:15:08

2
 var color:uint = 0xFF0000; 
     var r:uint = (color >> 16) & 0xFF; 
     var g:uint = (color >> 8) & 0xFF; 
     var b:uint = color & 0xFF; 

     var n:Number = 1/3; 

     var matrix:Array = new Array(); 
     matrix = matrix.concat([n,n,n,0,r]); 
     matrix = matrix.concat([n,n,n,0,g]); 
     matrix = matrix.concat([n,n,n,0,b]); 
     matrix = matrix.concat([0,0,0,1,0]); 

     _bitmapData.applyFilter(_bitmapData, _bitmapData.rect, new Point(), new ColorMatrixFilter(matrix));'