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

もう 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 に答える