我需要克隆从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,因此我的背景图标变白了。
请帮助我,因为我被困住了,无法理解我的下一步。
答案 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, 0
。 true
将透明度设置为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;
}
}
}