2011-06-22 66 views
0

情況是這樣的:壓縮位圖數據

我已經寫了一個簡單的MovieClip替換,它將現有導入的MovieClip轉換爲BitmapData序列。這消除了Flash在每幀上在MovieClip中呈現矢量數據的要求。

但BitmapData具有巨大的內存佔用。我已經嘗試將BitmapData轉換爲ByteArray並使用compress()方法。這導致顯着更小的內存佔用。但它已被證明是不切實際的。對於每次重繪,我嘗試瞭解壓縮()ByteArray,然後使用SetPixels將數據輸出到屏幕,然後重新壓縮()幀。這有效,但速度非常慢。

所以我想知道是否有其他人有我可以嘗試的方法。在Flash中,是否可以壓縮內存中的位圖數據並快速將其顯示在屏幕上?

我想知道原生動畫GIF如何在Flash中工作。它是在後臺將它們解壓縮到BitmapData,還是實時進行幀解壓縮?

也許有一個試圖壓縮圖像的Alchemy項目?

感謝什麼建議可以提供:)

回答

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); 

不知道的實用性爲阻擊器,但它是很好,它可以本地完成。

0

對於內存預留,你需要三思而後行之前,影片剪輯轉換爲位圖序列。這真的是需要嗎?爲什麼不緩存每個元素的位圖而不是一個大的位圖序列?你能分解一些東西嗎(比如背景)是靜態的(或者只是四處移動)?

我通常使用AnimatedBitmap(MovieClip的位圖序列替代品的名稱)僅適用於小尺寸動畫圖標和其他繁重的計算材料(如火/煙效果...)。儘可能地分解事情!

據我所知,沒有辦法壓縮位於內存中的BitmapData使用的內存,並且沒有任何與鍊金術有關的內容可以幫助改善在這種情況下使用的內存。

動畫GIF本身不會在Flash中運行,您需要一些庫來實現這一點。從bytearray.com搜索AnimatedGIF as3庫,實際上庫只是讀取原始byteArray中的gif文件,然後轉換爲animatedBitmap,就像您已完成的一樣。

0

這是一個古老的問題,但最近有這方面的信息:jackson Dunstan已經運行了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將在您嘗試從中讀取時解壓縮,然後在您不使用它約十秒時重新壓縮。

+0

這是非常有用的知道。我不知道這種行爲是否也出現在手機上 – Unknown123

+0

我真的不知道,但我不明白爲什麼它會有任何不同。 – Boris