AS 3 |克隆Png图像数据

时间:2011-08-08 03:39:17

标签: flash actionscript-3 png cloning

我需要克隆从AS3中的服务器加载的.png图像数据,这样我就不需要从服务器一次又一次地加载相同的数据。

在AS3中搜索克隆图像数据后,我能够通过互联网找到以下代码

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

通过使用此代码,我能够克隆位图数据,但我面临的问题是我的png背景是透明的。如果我将png数据加载到位图,我的图标背景变为白色。

任何帮助将不胜感激。


嗨洛朗& TheDarkIn1978, 非常感谢您快速恢复和宝贵的建议,

让我把完整的照片放在你们面前,

我正在尝试从服务器加载图标,这些图标必须在同一个动画片段中的多个位置显示。

为了显示图像数据,我创建了一个movieclip,我通过调用addChild()函数直接将加载的内容添加为其子项。

现在当我尝试在另一个动画片段上添加相同的图像数据作为其chil,新的数据父设置并且 此图片已从之前添加的内容中删除。所以最后这个图标只显示在movieclip的一个位置 (因为每个孩子都可以有一个单亲)。

因此我想克隆图像数据并在屏幕上显示, 当从服务器加载图像时,我调用以下功能将图像数据保存在本地,

   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;

我相信的透明度仅支持png格式,而不支持位图或jpeg,因此我的背景图标变白了。

请帮助我,因为我被困住了,无法理解我的下一步。

3 个答案:

答案 0 :(得分:2)

您发布的代码也应该复制Alpha频道。你如何显示位图?

编辑:我认为您的代码或显示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"));

也许尝试改变你的代码,使它像这个例子一样工作?

答案 1 :(得分:1)

或者,您可以将加载的Bitmap缓存在静态对象中。因此,这种方法不是重复加载相同的数据,而是允许您检查Bitmap是否先前已加载,并且只是根据数据的URL(例如)检索缓存的Bitmap,而不是重新加载Bitmap。

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

答案 2 :(得分:1)

您在更新中发布的代码几乎就在那里,您只需要在BitmapData调用中使用更多参数来获得透明度:

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

请注意我添加的true, 0true将透明度设置为true,而0表示Flash不应添加背景颜色。

编辑由于这引起了一些争论,我将详细说明为什么这是必要的(以及为什么我的一些评论略有不正确)。

首先是documentation for the BitmapData constructor。如果您喜欢阅读,那么这个答案的其余部分将毫无意义,因为在大多数情况下我只是要重复它。

因此,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;
        }
    }
}