如何通过颜色掩码组合2位图?

时间:2015-02-13 07:38:06

标签: actionscript-3 flash bitmap mask bitmapdata

我想使用3位图来创建1个结果位图。第一个是背景。第二个应在面具的帮助下绘制在第一个的顶部 图像被加载到Bitmap / BitmapData个对象中。

示例:
(红绿图像是面具,红色是可见部分)

  back      mask    source    result

enter image description here enter image description here enter image description here enter image description here

那我怎么能这样做?我在ActionScript-3中使用什么绘图功能?

感谢您的帮助!

修改
(我的第一个工作解决方案,仅适用于纯红色,绿色或蓝色)

var back: BitmapData = // load the back image
var mask: BitmapData = // load the mask image
var source:BitmapData = // load the source image (32-bit)
var result:BitmapData = back.clone();

// clone source because it will be modified in next step
var source2: BitmapData = source.clone();

// red of the mask becomes the alpha channel of source2
source2.copyChannel(mask, new Rectangle(0, 0, mask.width, mask.height), new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);

// draw source2 to result           
result.draw(source2);

(有更有效的方法吗?在此解决方案中,我必须克隆源代码以保持原始源位图的完整性。)

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最佳方式(性能和逻辑),但您可以尝试:

var background:BitmapData = new Background();
var bmd1:BitmapData = new Mask();
var bmd2:BitmapData = new SourceImage();

var bmDiff:Bitmap = new Bitmap(mergeMaskAndBackground(bmd2, background, bmd1));
addChild(bmDiff);

function mergeMaskAndBackground(src:BitmapData, background:BitmapData, msk:BitmapData):BitmapData
{
     var diffBmpData:BitmapData = BitmapData(src.compare(msk)); 
     diffBmpData.floodFill(0, 0, BitmapDataChannel.RED);

     diffBmpData.draw(background, new Matrix(), new ColorTransform(), BlendMode.OVERLAY, background.rect, true);

     return diffBmpData;
}