Flex中利用ByteArray與BitmapData互相轉換實現圖片的二進制保存與復原
近 日在項目當中須要將圖片保存到共享對象當中,開始用了倆天的時間作了對象的序列化,並以BitmapData的形式進行了圖片的序列化保存共享,由於系統 沒有提供更好的接口因此沒法測試,前天寫好了測試代碼,結果對象的其餘類型的屬性均可以訪問了,但圖片就是復原不了,到各大論天,技術網站考究了一天也沒 有答案,
只有「KingLong's」的「[AS3]BitmapBytes類-實現BitmapData與 ByteArray(Base64)之間互轉功能」一篇文章,看了半天,研究了半天,結果他把一個核心的類沒有公開,我發了幾回請求人家都沒有給回,失敗 啊!無奈本身多花一點時間吧,這個是必須解決的。研究倆天終於在下午四點成功了,心情甚爽,晚上還改善了生活!
此問題在網上問的人太多了,可是高手就是以爲本身牛逼,不告訴你,菜鳥須要幾天的時間甚至還會以失敗了結,因此我今天貼出來供你們參考。轉載請註明出處!!!謝謝合做
此類能夠將一個但是組件讀取爲圖像,而且以二進制形式進行序列化共享,還提供了二進制讀取爲Bitmap的方法,將圖片的source屬性直接賦值爲本方法就能夠了。此方法flex項目當中防止圖片連接斷開的最好解決辦法。
注:本人水平太差,不知道怎樣得出此方法的圖片壓縮和存儲效率,僅是實現了功能!
下面是完整的類 html
1 package com.kyit.lg..util 2 { /* 3 author:李廣業 4 */ 5 import flash.display.Bitmap; 6 import flash.display.BitmapData; 7 import flash.geom.Rectangle; 8 import flash.utils.ByteArray; 9 import mx.core.UIComponent; 10 public class BitmapBytes 11 { 12 public function BitmapBytes() 13 { 14 super(); 15 } 16 //將可視的UIComponent組件轉換爲ByteArray數組,我就是在UIComponent那裏放了一個圖片 17 public static function BitmapDataToByteArray(target : UIComponent):ByteArray{ 18 var imageWidth:uint = target.width; 19 var imageHeight:uint = target.height; 20 var srcBmp:BitmapData = new BitmapData( imageWidth, imageHeight ); 21 //將組件讀取爲BitmapData對象,bitmagData的數據源 22 srcBmp.draw( target ); 23 //getPixels方法用於讀取指定像素區域生成一個ByteArray,Rectangle是一個區域框,就是起始座標 24 var pixels:ByteArray = srcBmp.getPixels( new Rectangle(0,0,imageWidth,imageHeight) ); 25 //下面倆行將數據源的高和寬一塊兒存儲到數組中,爲翻轉的時候提供高度和寬度 26 pixels.writeShort(imageHeight); 27 pixels.writeShort(imageWidth); 28 return pixels; 29 } 30 //次方法的參數必須是像上面的ByteArray形式同樣的,即須要對象的大小; 31 //此方法返回的Bitmap能夠直接賦值給Image的source屬性 32 public static function ByteArrayToBitmap(byArr:ByteArray):Bitmap{ 33 if(byArr==null){ 34 return null; 35 } 36 //讀取出存入時圖片的高和寬,由於是最後存入的數據,因此須要到尾部讀取 37 var bmd:ByteArray= byArr; 38 bmd.position=bmd.length-2; 39 var imageWidth:int = bmd.readShort(); 40 bmd.position=bmd.length-4; 41 var imageHeight:int= bmd.readShort(); 42 var copyBmp:BitmapData = new BitmapData( imageWidth, imageHeight, true ); 43 //利用setPixel方法給圖片中的每個像素賦值,作逆操做 44 //ByteArray數組從零開始存儲一直到最後都是圖片數據,由於讀入時的高和寬都是同樣的,因此當循環結束是正好讀完 45 bmd.position = 0; 46 for( var i:uint=0; i<imageHeight ; i++ ) 47 { 48 for( var j:uint=0; j<imageWidth; j++ ) 49 { 50 copyBmp.setPixel( j, i, bmd.readUnsignedInt() ); 51 } 52 } 53 var bmp:Bitmap = new Bitmap( copyBmp ); 54 return bmp; 55 } 56 } 57 }
如下是mxml文件,只是我作測試用的沒有進行序列化,有須要的留言給我, 數組
1 <?xml version="1.0" encoding="utf-8"?> 2 <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 3 <mx:Script> 4 <![CDATA[ 5 import com.kyit.lg.util .BitmapBytes; 6 private var byteArr:ByteArray; 7 internal function copyToTar():void{ 8 //這倆個方法都是靜態的,由於項目當中經常使用 9 byteArr=BitmapBytes.BitmapDataToByteArray(sorImg); 10 tarImg.source=BitmapBytes.ByteArrayToBitmap(byteArr); 11 } 12 13 ]]> 14 </mx:Script> 15 <mx:Image x="33" y="56" id="sorImg" source="a.jpg"/> 16 <mx:Image x="33" y="265" id="tarImg" /> 17 <mx:Button x="33" y="26" label="a1" click="copyToTar();" />
出自:http://bbs.9ria.com/blog-239-2704.html測試