1

サーバーからロードした .png 画像データを AS3 に複製する必要があるため、サーバーから同じデータを何度もロードする必要はありません。

AS3 で画像データのクローン作成を検索した後、インターネット経由で次のコードを見つけることができました

clone = new Bitmap(Bitmap(this._loader.content).bitmapData.clone() )

このコードを使用すると、ビットマップ データのクローンを作成できますが、直面している問題は、png の背景が透明であることです。ロードした png データをビットマップにタイプキャストすると、アイコンの背景が白くなります。

どんな助けでも大歓迎です。


こんにちは Laurent & TheDarkIn1978, 素早い復帰と貴重な提案に感謝します.

皆さんの前に全体像を載せさせてください。

同じムービークリップの複数の場所に表示する必要があるサーバーからアイコンをロードしようとしています。

画像データを表示するために、addChild() 関数を呼び出して、読み込まれたコンテンツをその子として直接追加するムービークリップを作成しました。

別のムービークリップに同じ画像データをチルとして追加しようとすると、問題が発生し、データの新しい親が設定され、この画像が以前に追加されたコンテンツから削除されます。したがって、最後に、このアイコンはムービークリップの 1 つの位置にのみ表示されます (それぞれの子が 1 つの親を持つことができるため)。

したがって、画像データを複製して画面に表示することを考えました。サーバーからの画像が読み込まれるたびに、次の関数を呼び出して画像データをローカルに保存します。

   private var _bmapData : BitmapData;
    _bmapData = new BitmapData(_loader.width, _loader.height );
    _bmapData.draw( this );
    isImageLoaded=true;'

このデータを表示する必要がある場合はいつでも、次のコードを呼び出してpngデータを複製します

var dup : Image = new Image();
 dup.addChild(new Bitmap(_bmapData.clone()));
 return dup;

透過性はビットマップや jpeg ではなく png 形式でのみサポートされているため、背景のアイコンが白くなります。

立ち往生していて、次のステップを理解できないので、親切に助けてください。

4

3 に答える 3

2

投稿したコードは、アルファ チャネルもコピーする必要があります。ビットマップをどのように表示しますか?

編集:コードまたは BitmapData の表示方法に他の問題があるに違いないと思います。私はちょうど次のことを試してみましたが、うまくいきます:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener("complete", function(event) {
    // Cache the bitmap data
    var bmpData = event.currentTarget.content.bitmapData.clone();
    // Create a new Bitmap and display the bitmap data
    var bmp = new Bitmap(bmpData);
    addChild(bmp); // The PNG is displayed with transparency
});
loader.load(new URLRequest("http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png"));

この例のように動作するように、コードを変更してみてください。

于 2011-08-08T04:08:37.647 に答える
1

または、ロードしたビットマップを静的オブジェクト内にキャッシュできます。したがって、同じデータを繰り返しロードする代わりに、このアプローチにより、ビットマップが以前にロードされたかどうかを確認でき、ビットマップを再ロードする代わりに、データの URL (たとえば) に基づいてキャッシュされたビットマップを取得するだけです。

public static var cachedImages:Object = new Object();

...

private function checkCache(imageURL:String):void
{
     if (cachedImages[imageURL])
        showImage(cachedImages[imageURL]);
        else
        loadImage(imageURL);

}

...

private function loadImageCompleteHandler(evt:Event):void
{
    cachedImages[imageURLProperty] = evt.currentTarget.content;
}
于 2011-08-08T05:56:23.957 に答える
1

更新に投稿したコードはほぼ完成しています。透過性を機能させるには、BitmapData 呼び出しにさらにいくつかのパラメーターが必要です。

private var _bmapData : BitmapData;
_bmapData = new BitmapData(_loader.width, _loader.height, true, 0);
_bmapData.draw( this );

true, 0私が追加 したことに注意してください。true透明度をtrueに設定しており、0Flashによって背景色を追加する必要はありません。

編集これはいくつかの議論を集めているので、なぜこれが必要なのか (そして私のコメントのいくつかが少し間違っていた理由) について詳しく説明します。

まず、BitmapData コンストラクターのドキュメントを次に示します。あなたがそれを読みたいなら、この答えの残りの部分は無意味です.

したがって、BitmapData コンストラクターは、幅、高さ、透明度、および背景色の 4 つのパラメーターを受け取ります。幅と高さを無視して、デフォルトで true に設定されている透明度に直行しましょう。問題は、BitmapData オブジェクトが実際に透明な背景を実装するには、背景色を黒に設定する必要があることです。

transparent:Boolean (default = true) — ビットマップ画像がピクセルごとの透明度をサポートするかどうかを指定します。デフォルト値は true (透過) です。完全に透明なビットマップを作成するには、transparent パラメータの値を true に設定し、fillColor パラメータの値を 0x00000000 (または 0) に設定します。

驚くべきことに、BitmapData はデフォルトで透明に設定されていますが、背景色はデフォルトで に設定されているため0xFFFFFFFF、透明フラグの効果はありません。これは、BitmapData オブジェクトの背景を適切に透明にするために、純粋な黒の背景色を宣言する必要があることを意味します。

最後に、それでも証拠が必要な場合は、これを実行して楽しんでください。

package {

    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;

    public class Main extends MovieClip
    {
        private var bg          :Shape;

        private var bitmap1     :Bitmap;
        private var bitmap2     :Bitmap;

        public function Main():void
        {
            stage ? init() : addEventListener(Event.ADDED_TO_STAGE,init);
        }

        private function init(event:Event = null):void
        {
            if(event) removeEventListener(Event.ADDED_TO_STAGE,init);

            drawBackground();
            drawBitmaps();
        }

        private function drawBackground():void
        {
            //create a light colored background
            bg = addChild(new Shape()) as Shape;
            bg.graphics.beginFill(0xD0D0D0);
            bg.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
            bg.graphics.endFill();
        }

        private function drawBitmaps():void
        {
            //create a bitmap in the documented fashion
            var bmd1:BitmapData = new BitmapData(200,200,true);
            bitmap1 = addChild(new Bitmap(bmd1)) as Bitmap;
            //this time, give a background color
            var bmd2:BitmapData = new BitmapData(200,200,true,0x000000);
            bitmap2 = addChild(new Bitmap(bmd2)) as Bitmap;
            bitmap2.x = 200;
        }
    }
}
于 2011-08-08T08:59:27.197 に答える