通過FileReference打開本地圖片崩潰的解決方法

通過FileReference打開本地圖片崩潰的解決方法
最近在做圖片上傳工具,於是就遇到了FileReference打開本地圖片崩潰的問題,搜了下解決方法,得到以下文章:

在Flash 9之前,含Flash 9,Flash無法實現本地圖片預覽的功能。Flash 10添加了FileReference.load方法,使得本地圖片預覽成了可能。使用流程:
FileReference.browse(),FileReference.load(),以及Loader.loadBytes(FileReference.data),具體使用略過。
這種使用流程存在一個問題,
遇到大圖片時,本地預覽會存在比較嚴重的性能問題,預覽一張3.5M的圖片,內存升到60M,預覽15張3M左右大小的圖片時,內存飆升到500M,可能會引起用戶瀏覽器崩潰。
http://myadobe.ro/2008/11/24/filereference-the-end-of-upload-tyranny-guest-post-by-andrei-rosca/

給出瞭解決方案。

大致的思想是,在Loader加載到圖片數據後,做如下處理:

//make the image 50 px in height
var scale:Number=50/loader.height;
//and actually resize it
loader.width*=scale;
loader.height*=scale;
loader.width=Math.round(loader.width);
loader.height=Math.round(loader.height);
//use a container so we don't need a matrix in BitmapData.draw
var container:Sprite=new Sprite();
container.addChild(loader);
//take the snapshot
var bmpData:BitmapData=new BitmapData(container.width,container.height);
bmpData.draw(container);
var bmp:Bitmap=new Bitmap(bmpData);
這樣,相當於把圖片按比例縮放之後,獲取位圖數據,轉換爲Bitmap對象,這樣,只需要把Bitmap對象添加到Container中即可實現圖片預覽。

上述方法只在Flash Player自身運行時有效,對於瀏覽器中加載swf預覽本地圖片,還需要做一個操作:
(loader.contentLoaderInfo.content as Bitmap).bitmapData.dispose();

//從內存中刪除原圖的bitmapData引用
loader.unload();

但是這個方法並未完全解決問題,經過觀察發現第一次打開瀏覽器並打開第一張大圖後必然發生崩潰,那麼猜想可能是由於flash player內存空間不夠,而FileReference的load方法載入文件後得不到足夠的內存空間而引發崩潰。

所以我的做法是在程序最開始加上如下代碼:

(new BitmapData(2000, 2000)).dispose();
System.gc();

創建一個足夠大的位圖來開闢flash player的內存。
實踐證明該方法管用!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章