2011-05-02 175 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));'