2

塗りつぶされたShape と、Shape のバウンディング ボックスと同じ幅と高さの BitmapData があります。
BitmapData から Shape を切り取る必要があります (基本的に BitmapData を Shape に描画します...) [そのように: http://imgur.com/uwE5F.png ]

私はかなりハックな方法を使用します:

        public static function cutPoly(img:BitmapData, s:Shape, bounds:Bounds):BitmapData {
        var temp:BitmapData = new BitmapData(bounds.width, bounds.height, true);
        Main.inst.stageQuality("low"); //hack to kill anti-aliasing
        temp.draw(s,new Matrix());
        Main.inst.stageQuality("high"); // end hack

        //0xFF00FF00 is the color of the shape
        makeColTrans(temp,0xFF00FF00); //makes the color transparent :P
        //return temp;
        img.draw(temp);
        //img.draw(temp);
        temp.dispose();
        makeColTrans(img, 0xFFFFFFFF);
        return img;
    }

より良い方法があるかどうか疑問に思っていました...単なるハックではない方法です。

4

4 に答える 4

5

ハックと見なすこともできますが、コンテナスプライトにビットマップと(描画された)図形を追加し、その図形でビットマップをマスクして、結果の画像を再度描画することができます。取得できる唯一の利点は、ランタイムのネイティブ描画アルゴリズムを使用することです。これは、makeColTransがビットマップ全体をピクセルごとにスキャンする場合にのみ当てはまります。

コードサンプル用に編集:

    public static function cutPoly(sourceBitmapData:BitmapData, maskShape:Shape, bounds:Rectangle):BitmapData {
        // you might not need this, supplying just the sourceBitmap to finalBitmapData.draw(), it should be tested though.
        var sourceBitmapContainer:Sprite = new Sprite();
        sourceBitmapContainer.addChild(sourceBitmap);
        sourceBitmapContainer.addChild(maskShape);

        var sourceBitmap:Bitmap = new Bitmap(sourceBitmapData);
        maskShape.x = bounds.x;
        maskShape.y = bounds.y;
        sourceBitmap.mask = maskShape;

        var finalBitmapData:BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00ffffff);
        // or var finalBitmapData:Bitmap = new BitmapData(maskShape.width, maskShape.height); not too sure about the contents of the bounds...
        finalBitmapData.draw(sourceBitmapContainer);

        return finalBitmapData;
    }
于 2010-12-05T21:55:52.450 に答える
1

draw() メソッドの 2 番目の引数は変換行列を受け取ります。ここでオフセット、回転、傾斜などを指定できます。次に、その bitmapdata オブジェクトを形状の beginBitmapFill のソースとして使用します。

于 2010-12-05T23:56:31.930 に答える
0

この「Cookie カット」アルゴリズムをほとんど BitmapData オブジェクトから実行しようとしている場合は、次のことを考慮してください。

var bmp:BitmapData = pSourceBmp.clone();
var alphaBmp:BitmapData = new BitmapData(shape.width, shape.height, true, 0);

alphaBmp.draw( shape );

var alphaOrigin:Point = new Point();
var pasteOrigin:Point = new Point();

bmp.copyPixels( bmp, bmp.rect, pasteOrigin, alphaBmp, alphaOrigin, true);

注:このコードはテストされていません。

私はこのようなものをブリッティングエンジンで「クッキーカット」の目的で使用しましたが、指定されたベクターグラフィックスから形状を抽出するために美しく機能しました. マスクの興味深い代替品。

于 2011-02-25T18:01:17.533 に答える
0

形の周りの色は統一されていますか?その場合、その色の付いたピクセルの最初のインスタンスを見つけ、その座標から 0x00000000 の bitmapdata を floodFill() して、結果を新しい透過 bitmapdata に描画することができます。

編集

しきい値を使用した別の例を次に示します。完璧にはほど遠いですが、そこへの道のりの一部になります。この場合、クラス「Tile」は、リンク ID を使用して質問で提供した画像です。

import flash.display.BitmapData;
import flash.geom.Point;
import flash.display.Bitmap;

var sample : Tile = new Tile();

var alphaBitmap : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
    alphaBitmap .draw ( sample );
    alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "<", 0xFFEFEFEF, 0xFFFFFFFF, 0xFFFFFFFF );
    alphaBitmap.threshold( alphaBitmap, alphaBitmap.rect, new Point(), "!=", 0xFFFFFFFF, 0x00000000 );

    addChild ( new Bitmap ( alphaBitmap ) );

var source : Tile = new Tile();
var output : BitmapData = new BitmapData ( sample.width, sample.height, true, 0x00000000 );
    output.copyPixels( source, source.rect, new Point(), alphaBitmap );

var outputBitmap : Bitmap = new Bitmap ( output );
    outputBitmap.x = outputBitmap.width;

addChild ( outputBitmap );
于 2010-12-23T01:53:34.810 に答える