0

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

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

还有什么比这更好的方法吗?

4

2 回答 2

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;
    
于 2012-10-23T08:36:53.880 回答
1

另一种选择是使用位图缓存。它需要应用于遮罩以及被遮罩:

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);
于 2012-10-23T08:49:43.743 回答