我正在尝试将我放在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是我放置图片的地方。有人看错了吗?
答案 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 属性,但上面的内容应该有用......
如果你说对了,请告诉我。)