2011-05-02 8 views
2

ActionScript 3.0을 사용하여 그레이 스케일 그라디언트 비트 맵을 동적으로 색칠해야합니다. 그라디언트는 흰색에서 검은 색으로 가고 어두운 색은 0xFF0000, 가장 밝은 0xFFFFFF가되어야합니다. 혼합 된 결과와 안정적인 해결책이없는 paletteMap 및 ColorMatrixFilter를 시도했습니다.회색 음영 이미지 as3을 색칠

답변

1

빨강 색 채널에 255 오프셋이있는 행렬을 구축하여 ColorMatrixFilter와 매우 관련이 있습니다 (그렇지 않은 경우 단위 행렬).

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

또한 색으로 채워진 새 bitmapData를을 만들 수 있습니다

이 샘플 문서 클래스는 FLA 라이브러리는 720 × 480 수출 기호 flash.display.BitmapData의 서브 클래스이다 "GradientBMD"가 가정 당신은 그라데이션 (검은 색 대신에)에 램프 싶은 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 색상으로 그라디언트를 색칠 할 수 있습니다. 솔리드 컬러로 색을 칠하는 경우 필터 솔루션을 가장 좋은 방법으로 사용하기 때문에 필자는 필터 솔루션을 맨 위로 이동했습니다. 색조가 일정하지 않은 경우 (즉, 적용 할 두 번째 색조 비트 맵이있는 경우) 두 번째 해결 방법을 사용합니다. –

+0

감사합니다! ColorMatrix 필터가 가장 효과적입니다. 아래에 게시 된 최종 솔루션 - 그레이 스케일 이미지뿐만 아니라 컬러도 잘 작동합니다. –

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));' 
관련 문제