加载后无法显示非常大的图像

时间:2013-05-08 10:51:29

标签: actionscript-3 air jpeg bitmapdata

我有一个很大的JPEG图像文件。它的尺寸是19000 * 14000,文件大小约为41M。我正在使用AIR 3.3 SDK,但在加载完成后我无法在舞台上看到图像。有谁知道这个问题的原因是什么?

这是我的代码:

protected function button1_clickHandler(event:MouseEvent):void
{
    file = new File();
    file.addEventListener(Event.SELECT, imageFileHandler);
    file.browseForOpen("image file", [new FileFilter("image file","*.jpg;*.jpeg")]);
}

protected function imageFileHandler(event:Event):void
{
    fs = new FileStream();
    fs.openAsync(file, FileMode.READ);
    fs.addEventListener(Event.COMPLETE, bytesComplete);
}

protected function bytesComplete(event:Event):void
{
    loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadHandler);
    var bytes:ByteArray = new ByteArray();
    fs.readBytes(bytes);
    loader.loadBytes(bytes);
    fs.close();
}

protected function imageLoadHandler(event:Event):void
{
    image.source = (loader.content as Bitmap).bitmapData;
}

2 个答案:

答案 0 :(得分:1)

flash player和air对要显示的图像文件大小有限制。如果我没记错的话,它的4096 * 4096。如果要使用大图像,请将其切片为更多,更小的图像,单独加载,然后逐个放置。它就像你想要谷歌地图加载整个地球。它只是加载可见部分。你也应该考虑这一点。

你也可以尝试调整bitmapdata的大小,或者包含它的sprite,以使图像可见。

答案 1 :(得分:1)

我敢打赌你的舞台比实际图像要小。 创建一个与舞台一样大的bitmapData。 使用BitmapData的copyPixels将像素从大像素复制到小像素(当然可以对x和y位置进行贴图)。

确保在使用copyPixels之前执行bitmapData.lock()并在之后执行unlock()。这些可以防止无用的更新,这些更新会导致速度变慢甚至崩溃。 copyPixels是一种“胖”方法:D

这样您就不必将其拆分。您可以为enterframe或mousemove添加此更新。