2010-06-21 42 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);  
} 

我不知道的方式,将完全避免使用装载机。