當應用程序需要將位圖圖像保存到本地或發送到服務端時, 通常的方法是在發送數據前將圖像通過PNG或JPEG編碼。如果只是想保存位圖圖像,只要序列化BitmapData即可,將圖像轉換爲JPEG/PNG是完全沒有必要的。 // ActionScript 3.0
複製代碼// 假定“bitmapImage”是需要序列化的位圖對象 var bytes:ByteArray = bitmapImage.bitmapData.getPixels(bitmapImage.bitmapData.rect); 這個方法會返回一個ByteArray對象,BitmapData的每個像素對應ByteArray對象中的一個4字節的無符號整型。這意味着如果是20x20的位圖圖像, 對應的ByteArray對象在壓縮前有1600個字節(20x20x4=1600) var bytes:ByteArray = bitmapImage.bitmapData.getPixels(bitmapImage.bitmapData.rect);
複製代碼bytes.compress(); 得到了位圖圖像無損壓縮的二進制數據了. var bytes:ByteArray = new ByteArray();
複製代碼bytes.writeUnsignedInt(bitmapImage.bitmapData.width); bytes.writeBytes(bitmapImage.bitmapData.getPixels(bitmapImage.bitmapData.rect)); bytes.compress(); 保存文件 // ** 需要Flash Player 10以上版本 **
複製代碼function on_buttonClick(evt:MouseEvent):void { var bytes:ByteArray = new ByteArray(); bytes.writeUnsignedInt(bitmapImage.bitmapData.width); // 保存圖像寬度 bytes.writeBytes(bitmapImage.bitmapData.getPixels(bitmapImage.bitmapData.rect)); //保存圖像字節數組 bytes.compress(); new FileReference().save(bytes, "image.bmd"); // 默認文件名: "image.bmd" } 文件可任意命名.上面的例子中, 我使用了".bmd"(BitmapData)做爲文件擴展名,不過這只是一個自己想出的文件類型.最終保存的文件無有效MIME的, 不會當作已知的文件類型運行 - 這是我們自定義的二進制數據格式文件, 僅僅是用來保存圖像數據, 方便以後我們的程序重用. var ldr:URLLoader = new URLLoader();
複製代碼ldr.dataFormat = URLLoaderDataFormat.BINARY; // ** 這裏一定要指定dataFormat爲URLLoaderDataFormat.BINARY ** ldr.addEventListener(Event.COMPLETE, on_fileLoad); ldr.addEventListener(IOErrorEvent.IO_ERROR, on_fileLoadError); ldr.load(new URLRequest(pathToBitmapDataFile)); 事件處理方法on_fileLoad: function on_fileLoad(evt:Event):void
複製代碼{ if (evt.type == Event.COMPLETE) { var data:ByteArray = URLLoader(evt.target).data as ByteArray; if (data) { try { data.uncompress(); } catch(e:Error) { } // 此時的數據已經是解壓後的字節數組了 // ... 處理數據 ... } } } 現在我們來取出位圖圖像的尺寸. 還記得之前我們在二進制數據的頭4個字節保存了寬度值吧. // 數據解壓後
複製代碼var width:int = data.readUnsignedInteger(); // 起始的4個字節 得到高度: // after data.uncompress()
複製代碼var height:int = ((data.length - 4) / 4) / width; // (data.length - 4) ** 去掉開始的4個字節,其餘的便是位圖的字節數組了 ** // ((data.length - 4) / 4) ** 每個像素4個字節長, 所以要除以4得到總像素數 ** // ((data.length - 4) / 4) / 寬度 ** 記住,因爲是矩形才能這樣計算出高度 ** 注意:如果要忽略尺寸計算, 可以把高寬同時保存在二進制數據中.兩種方法都是可行的, 可自行選擇. var bmd:BitmapData = new BitmapData(width, height, true, 0); // 32位支持alpha通道的位圖
複製代碼bmd.setPixels(bmd.rect, data); // 數據的position指向第5個字節了 var bm:Bitmap = new Bitmap(bmd); addChild(bm); 結論 |
Bitmap序列化(將BitmapData保存爲原生Binary/ByteArray),AS3保存圖像的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.