将带有图像的flex组件转换为位图

时间:2010-07-28 00:56:21

标签: flex flash actionscript-3

我正在尝试将我放在flex canvas组件中的图像放到位图中。我能够达到我没有收到错误的程度但是没有图像出现,我作为jpg保存的图像是空白的。我想我没有正确设置位图数据,但无法弄清楚我做错了什么。

以下是我将其转换为位图的代码:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop);
   var imageByteArray:ByteArray = imageSnap.data as ByteArray;
   var bLoader:Loader = new Loader();
   bLoader.loadBytes(imageByteArray);

   var bmd:BitmapData = new BitmapData(500,500);
   bmd.draw(bLoader);

   var imgTest:Image = new Image();
   imgTest.source = bmd;
   _renderPop.renderCanvas.addChild(imgTest);



   var fileRef:FileReference = new FileReference();
   fileRef.save(bLoader, 'testImage.jpg');

_renderPop.renderCanvas是我放置图片的地方。有人看错了吗?

2 个答案:

答案 0 :(得分:1)

您的“加载程序”代码错误。在捕获图像之后,您可以使用FileReference立即保存数据:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop);
var fileRef:FileReference = new FileReference();    
fileRef.save(imageSnap.data, 'testImage.png'); 

该imageSnap不包含BitmapData但包含png图像字节。为了显示图像,您需要捕获BitmapData而不是图像,并从位图数据创建位图:

var bmd:BitmapData = ImageSnapshot.captureBitmapData(_renderPop);
var imgTest:Image = new Image();
imgTest.source = new Bitmap(bmd);
_renderPop.renderCanvas.addChild(imgTest); 

结果本地testImage.png在文件系统上创建,并在canvas中显示。如果你需要jpg,你应该指定:

var imageSnap:ImageSnapshot = ImageSnapshot.captureImage(_renderPop, 0, new JPEGEncoder());

答案 1 :(得分:0)

在您的代码中:

var bLoader:Loader = new Loader();
bLoader.loadBytes(imageByteArray);

...你假设字节是立即加载的;尝试在加载器上放置一个事件监听器,如下所示:

bLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

private function completeHandler(event:Event):void
{
    // ... the rest of your code goes here
}

loadBytes 函数的工作方式与 load 函数类似,因为它们都是异步进程,因此您需要事件侦听器。这有点违反直觉,我自己多次犯了同样的错误。

如果这不起作用,可能会忽略 contentLoaderInfo 属性,但上面的内容应该有用......

如果你说对了,请告诉我。)