如何将位图设置为掩码

时间:2012-10-23 08:15:20

标签: actionscript-3

我想将包含透明区域的图片作为遮罩应用于显示对象。 掩码只显示掩码有颜色的区域。但事实上,显示对象仍然显示整个区域。所以我将位图转换为矢量图像,这解决了问题,但转换方法很糟糕。

    public static function createVectorImage(bd:BitmapData,colorKey:uint = 0):Shape{

        if(bd==null){
            return null;
        }
        var sh:Shape = new Shape();
        var g:Graphics = sh.graphics;
        g.beginBitmapFill(bd);
        var beginPixel:int  = -1;
        var i:int,il:int,j:int,jl:int;
        var value:uint;
        for(i = 0,il=bd.height;i<il;i++){
            for(j = 0,jl = bd.width;j<jl;j++){
                value = bd.getPixel32(j,i);
                if(value!=colorKey&&beginPixel==-1){
                    beginPixel = j;
                }else if(value==colorKey&&beginPixel!=-1){
                    //draw rect
                    g.drawRect(beginPixel,i,j-beginPixel,1);
                    beginPixel = -1;
                }
            }
            if(beginPixel!=-1){
                g.drawRect(beginPixel,i,j-beginPixel,1);
                beginPixel = -1
            }
        }
        g.endFill();

        return sh;
     }

有没有比这更好的方法?

2 个答案:

答案 0 :(得分:3)

您可以将显示对象转换为位图,然后在其上应用蒙版。

  1. 将显示对象转换为位图数据:

    var rect:Rectangle = displayObject.getRect();
    var displayBD:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
    
    displayBD.draw(displayObject);
    
  2. 应用面具:

    private static const ORIG:Point = new Point(0, 0);
    private static function createBitmapDataWithMask(
            baseBD:BitmapData, maskBD:BitmapData):BitmapData
    {
        var bitmapData:BitmapData;
    
        bitmapData = new BitmapData(baseBD.width, baseBD.height, true, 0x000000);
        bitmapData.copyPixels(baseBD, baseBD.rect, ORIG, maskBD, ORIG, true);
    
        return bitmapData;
    }
    
  3. 显示位图数据:

    var bitmapData:BitmapData = createBitmapDataWithMask(displayBD, maskBD);
    var bitmap:Bitmap = new Bitmap(bitmapData, "auto", true);
    
    addChild(bitmap);
    
  4. 如果从舞台中删除位图,请不要忘记释放位图数据!

    removeChild(bitmap);
    bitmap.bitmapData.dispose();
    bitmap = null;
    

答案 1 :(得分:1)

另一种选择是使用bitmap caching。它需要应用于面具和maskee:

var bd:BitmapData = new BitmapData(200, 200, true, 0x00000000);
bd.fillRect(new Rectangle(0, 0, 40, 40), 0xff000000);

var mask:Bitmap = new Bitmap(bd);
mask.cacheAsBitmap = true;

var maskee:Sprite = new Sprite();
maskee.cacheAsBitmap = true;
maskee.graphics.beginFill(0xff0000, 1);
maskee.graphics.drawRect(0, 0, 200, 200);
maskee.graphics.endFill();
maskee.mask = mask;

addChild(mask);
addChild(maskee);