【问题标题】:Coloring grayscale image as3为灰度图像着色 as3
【发布时间】:2011-05-02 18:51:53
【问题描述】:

我需要使用 ActionScript 3.0 为灰度渐变位图动态着色。渐变从白色到黑色,最暗的颜色必须是 0xFF0000,最亮的颜色必须是 0xFFFFFF。尝试了具有混合结果且没有稳定解决方案的paletteMap 和 ColorMatrixFilter。

【问题讨论】:

    标签: flash actionscript-3 flex4


    【解决方案1】:
            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));'
    

    【讨论】:

      【解决方案2】:

      很可能使用 ColorMatrixFilter,通过在红色通道上构建具有 255 偏移量的矩阵(否则为单位矩阵)。

      这个示例文档类假定 FLA 库有一个 720 x 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);
              }
          }
      }
      

      您还可以创建一个新的 bitmapData,填充您希望渐变渐变到的颜色(代替黑色),然后使用 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);
              }
          }
      }
      

      【讨论】:

      • 在 ColorMatrixFilter 示例中,我将其特殊设置为红色。显然,您可以通过设置每个通道的偏移量将渐变着色为任意 RGBA 颜色。我将过滤器解决方案移至响应的顶部,因为如果您要染成纯色,这是最好的方法。如果色调以某种方式不均匀(即您有第二个色调位图要应用),您将使用第二种解决方案。
      • 谢谢!因为我处理了很多透明胶片,所以 ColorMatrix 滤镜效果最好。在下面发布了我的最终解决方案 - 适用于彩色和灰度图像。
      【解决方案3】:

      您也可以使用 blendMode="luminosity" 选项,而不是使用 ColorMatrixFilter(在另一个答案中描述)。

      我有一篇关于 ActionScript 中灰度图像的博文,可能会有所帮助: http://flexdevtips.blogspot.com/2011/01/grayscale-images-progressbar-rating.html

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 2012-05-28
        • 2017-07-31
        • 2010-12-22
        • 2023-02-22
        • 2023-03-26
        • 2012-12-12
        • 2015-07-01
        相关资源
        最近更新 更多