2010-06-21 54 views
2

我希望能夠通過在ByteArrays之間來回轉換來將圖像移入和移出Flex。我在這方面遇到了一些麻煩,所以我設計了一個簡單的測試程序,甚至是我無法工作。下面是我想對現在的代碼:Flex中的ByteArray圖像

protected function button3_clickHandler(event:MouseEvent):void 
{ 
var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler2); 
loader.load(new URLRequest("file:///c:/win.jpg")); 
} 

private function loaderCompleteHandler2(event:Event):void 
{ 
var loader:Loader = (event.target as LoaderInfo).loader; 
var bmp:Bitmap = Bitmap(loader.content); 
image1.source = bmp; 
myBmpData = bmp.bitmapData; 
myByteArray = bmp.bitmapData.getPixels(myBmpData.rect); 
} 

protected function button4_clickHandler(event:MouseEvent):void 
{ 
    var loader:Loader = new Loader(); 
loader.loadBytes(myByteArray); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderCompleteHandler); 
} 

private function loaderCompleteHandler(event:Event):void 
{ 
var loader:Loader = (event.target as LoaderInfo).loader; 
var bmp:Bitmap = Bitmap(loader.content); 
image1.source = bmp; 
} 

到目前爲止,過程如下頂部到底部:點擊按鈕,如圖3所示,圖像顯示,一切都很順利。單擊按鈕4,然後收到「錯誤#2044:未處理的IOErrorEvent :. text =錯誤#2124:加載的文件是未知類型。」之後的行「loader.loadBytes(myByeArray);」在函數button4_clickHandler中。據我所知,我正在按照預期使用一切東西。我真的很感激任何建議,讓我朝着正確的方向前進。謝謝!

回答

1

看看下面的代碼:

var l:URLLoader = new URLLoader(new URLRequest("/path/to/image")); 
l.dataFormat = URLLoaderDataFormat.BINARY; 
l.addEventListener(Event.COMPLETE, loaded); 

private function loaded(event:Event):void 
{ 
    var ba:ByteArray = event.currentTarget.data as ByteArray; 

    b64Img.source = Base64.encode(ba); 
} 

b64Img對象,我設置了性質上是Base64Image這是偉大FlexLib項目的一部分。所以,實際上,你在做什麼是以下幾點:

  • 加載圖像作爲二進制流中
  • Base64編碼的字節
  • 顯示在屏幕上

乾杯

+0

順便說一句,我使用JP Auclair的Base64類: http://jpauclair.net/2010/01/09/base64-optimized-as3-lib/ – infomaniac 2010-07-07 08:20:45

+0

該解決方案運行良好,但我遇到另一個問題:1.使用byteArray(壓縮或更改byteArray)從現有圖像2.deal中獲取byteArray並返回,然後我想要顯示一個新的Image,它使用新的byteArray,b64Img.source = Base64.encode(newBuyeArray) ,問題是圖像無法顯示 – jason 2012-04-18 03:26:51

0

Danny Kopping的解決方案應該可以工作,並且URLLoader應該比Loader.load()更好地執行。

但是,然後,Base64Image的使用恕我直言,不是最佳。在內部,Base64Image使用Loader.loadBytes &預先解碼Base64 - 如此有效地,有一個編碼Base64,然後解碼。

我建議只需使用裝載機的loadBytes方法是這樣的:

private function loaded(event:Event):void 
{ 
    var loader:Loader = new Loader(); 
    loader.loadBytes(event.currentTarget.data as ByteArray);  
} 

我不知道的方式,將完全避免使用裝載機。