1

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

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

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

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

任何帮助,将不胜感激。


嗨 Laurent 和 TheDarkIn1978,非常感谢您的快速回复和您的宝贵建议,

让我把全图摆在你们面前,

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

为了显示图像数据,我创建了一个影片剪辑,在其中我通过调用 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,因此我的背景图标变白了。

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

4

3 回答 3

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"));

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

于 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,并且0说没有背景颜色应该由Flash添加。

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

首先是 BitmapData 构造函数的文档。如果您喜欢阅读该内容,那么此答案的其余部分将毫无意义,因为在大多数情况下,我将重复一遍。

因此,BitmapData 构造函数需要 4 个参数,宽度、高度、透明度和背景颜色。让我们忽略宽度和高度,直接进入透明度,默认情况下设置为 true。要注意的是,为了让 BitmapData 对象真正实现透明背景,它的背景颜色必须设置为黑色。

transparent:Boolean (default = 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 回答