【发布时间】:2011-05-02 18:51:53
【问题描述】:
我需要使用 ActionScript 3.0 为灰度渐变位图动态着色。渐变从白色到黑色,最暗的颜色必须是 0xFF0000,最亮的颜色必须是 0xFFFFFF。尝试了具有混合结果且没有稳定解决方案的paletteMap 和 ColorMatrixFilter。
【问题讨论】:
标签: flash actionscript-3 flex4
我需要使用 ActionScript 3.0 为灰度渐变位图动态着色。渐变从白色到黑色,最暗的颜色必须是 0xFF0000,最亮的颜色必须是 0xFFFFFF。尝试了具有混合结果且没有稳定解决方案的paletteMap 和 ColorMatrixFilter。
【问题讨论】:
标签: flash actionscript-3 flex4
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));'
【讨论】:
很可能使用 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);
}
}
}
【讨论】:
您也可以使用 blendMode="luminosity" 选项,而不是使用 ColorMatrixFilter(在另一个答案中描述)。
我有一篇关于 ActionScript 中灰度图像的博文,可能会有所帮助: http://flexdevtips.blogspot.com/2011/01/grayscale-images-progressbar-rating.html
【讨论】: