压缩BitmapData

时间:2011-06-22 06:36:06

标签: actionscript compression bitmapdata

情况如下:

我编写了一个简单的MovieClip替换,它将现有导入的MovieClip转换为BitmapData序列。这消除了Flash在每个帧上的MovieClip中渲染矢量数据的要求。

但BitmapData占用大量内存。我已经尝试将BitmapData转换为ByteArray并使用compress()方法。这导致显着更小的内存占用。但事实证明这是不切实际的。对于每次重绘,我尝试解压缩()使用ByteArray,然后使用SetPixels将数据blit到屏幕,然后重新压缩()帧。这有效,但速度非常慢。

所以我想知道是否有其他人有我可以尝试的方法。在Flash中,是否可以压缩内存中的位图数据并快速将其blit到屏幕上?

我想知道原生动画GIF如何在Flash中运行。它是在幕后将它们解压缩到BitmapData,还是在运行中进行帧解压缩?

也许有一个Alchemy项目尝试blit压缩图像?

感谢您提供的任何建议:)

3 个答案:

答案 0 :(得分:1)

@thienhaflash的回复很好但已经过了一年,从那时起,Flash Player和AIR Runtime扩展了他们的能力。今天我在Adobe's AS3 Guide的这个小花絮上签了名。从播放器11.3开始,可以使用本机图像压缩技术。这是一个片段:

// Compress a BitmapData object as a JPEG file. 
var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00); 
var byteArray:ByteArray = new ByteArray(); 
bitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);

不确定blitting的实用性,但它可以原生地完成。

答案 1 :(得分:0)

对于内存预留,在将MovieClip转换为Bitmap序列之前需要三思而后行。真的需要吗?你可以解决问题,因为有几件事(比如背景)是静态的(或只是四处移动)为什么不为每个元素缓存位图而不是一个大的Bitmap序列?

我经常使用AnimatedBitmap(MovieClip的位图序列替代名称)仅用于小尺寸动画图标和其他繁重的计算内容(如火/烟效果......)。尽可能多地分解!

据我所知,没有办法压缩位于内存中的BitmapData使用的内存,并且没有任何与Alchemy相关的内容可以帮助改善在这种情况下使用的内存。

动画GIF本身不能在Flash中运行,你需要一些库来做到这一点。从bytearray.com搜索AnimatedGIF as3库,实际上该库只是在原始byteArray中读取gif文件并转换为animatedBitmap,就像你完成的一样。

答案 2 :(得分:0)

这是一个老问题,但最近有这方面的信息:杰克逊邓斯坦已经运行了bitmapdatas,事实证明从压缩源获得的位图数据将在一段时间未使用后“缩小”。 以下是文章:http://jacksondunstan.com/articles/2112,以及在开头提到的两篇文章。

所以你绝对可以这样做:

var byteArray:ByteArray = new ByteArray(); 
myBitmapData.encode(new Rectangle(0,0,640,480), new flash.display.JPEGEncoderOptions(), byteArray);
var loader = new Loader();
loader.addEventListener(Event.COMPLETE, function(_e:Event):void{
  if(loader.content is Bitmap){
    myBitmapData.dispose()
    myBitmapData= Bitmap(loader.content).bitmapData;
  }
});
loader.loadBytes(byteArray);

我不确定它是否会按原样运行,你肯定希望更好地处理你的记忆。但是现在,当您尝试从中读取时,myBitmapData将被解压缩,然后在您不使用它时大约十秒钟时重新压缩。