Flex中利用ByteArray與BitmapData互相轉換實現圖片的二進制保存與復原

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測試

相關文章
相關標籤/搜索