AS3通过PNGEncoder类将图片与ByteArray互换实例

as3中图片转换成ByteArray再由ByteArray转换成图片的过程。

其中是调用Abode官方的类 PNGEncoder来实现的。但是之前总是报错,具体如下:

var encoder:PNGEncoder = new PNGEncoder();
然后var bytes:ByteArray=encoder.encode(_bmd); 
调用encode这个方法 
结果报错 1061: 调用可能未定义的方法 encode (通过 static 类型 PNGEncoder 引用)。

后来我才发现,需要将var encoder:PNGEncoder = new PNGEncoder();
然后var bytes:ByteArray=encoder.encode(_bmd); 这两句改成

var bytes:ByteArray=PNGEncoder.encode(_bmd); 因为encode为静态函数。

好啦,下面把源码贴上:

首先为 Abode官方的类 PNGEncoder

 

 

Java代码  收藏代码
  1. package   
  2. {  
  3.         import flash.geom.*;  
  4.         import flash.display.Bitmap;  
  5.         import flash.display.BitmapData;  
  6.         import flash.utils.ByteArray;  
  7.   
  8.                   
  9.         public class PNGEncoder  
  10.         {  
  11.                                           
  12.             public static function encode(img:BitmapData):ByteArray   
  13.     {  
  14.                 // Create output byte array  
  15.                 var png:ByteArray = new ByteArray();  
  16.                 // Write PNG signature  
  17.                 png.writeUnsignedInt(0x89504e47);  
  18.                 png.writeUnsignedInt(0x0D0A1A0A);  
  19.                 // Build IHDR chunk  
  20.                 var IHDR:ByteArray = new ByteArray();  
  21.                 IHDR.writeInt(img.width);  
  22.                 IHDR.writeInt(img.height);  
  23.                 IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA  
  24.                 IHDR.writeByte(0);  
  25.                 writeChunk(png,0x49484452,IHDR);  
  26.                 // Build IDAT chunk  
  27.                 var IDAT:ByteArray= new ByteArray();  
  28.                 for(var i:int=0;i < img.height;i++)   
  29.      {  
  30.                     // no filter  
  31.                     IDAT.writeByte(0);  
  32.                     var p:uint;  
  33.                     var j:int;  
  34.                     if ( !img.transparent )   
  35.       {  
  36.                         for(j=0;j < img.width;j++)   
  37.        {  
  38.                             p = img.getPixel(j,i);  
  39.                             IDAT.writeUnsignedInt(  
  40.                                 uint(((p&0xFFFFFF) << 8)|0xFF));  
  41.                         }  
  42.                     }  
  43.       else   
  44.       {  
  45.                         for(j=0;j < img.width;j++)   
  46.        {  
  47.                             p = img.getPixel32(j,i);  
  48.                             IDAT.writeUnsignedInt(  
  49.                                 uint(((p&0xFFFFFF) << 8)|  
  50.                                 (p>>>24)));  
  51.                         }  
  52.                     }  
  53.                 }  
  54.                 IDAT.compress();  
  55.                 writeChunk(png,0x49444154,IDAT);  
  56.                 // Build IEND chunk  
  57.                 writeChunk(png,0x49454E44,null);  
  58.                 // return PNG  
  59.                 return png;  
  60.             }  
  61.           
  62.             private static var crcTable:Array;  
  63.             private static var crcTableComputed:Boolean = false;  
  64.           
  65.             private static function writeChunk(png:ByteArray,   
  66.                     type:uint, data:ByteArray):void {  
  67.                 if (!crcTableComputed) {  
  68.                     crcTableComputed = true;  
  69.                     crcTable = [];  
  70.                     var c:uint;  
  71.                     for (var n:uint = 0; n < 256; n++) {  
  72.                         c = n;  
  73.                         for (var k:uint = 0; k < 8; k++) {  
  74.                             if (c & 1) {  
  75.                                 c = uint(uint(0xedb88320) ^   
  76.                                     uint(c >>> 1));  
  77.                             } else {  
  78.                                 c = uint(c >>> 1);  
  79.                             }  
  80.                         }  
  81.                         crcTable[n] = c;  
  82.                     }  
  83.                 }  
  84.                 var len:uint = 0;  
  85.                 if (data != null) {  
  86.                     len = data.length;  
  87.                 }  
  88.                 png.writeUnsignedInt(len);  
  89.                 var p:uint = png.position;  
  90.                 png.writeUnsignedInt(type);  
  91.                 if ( data != null ) {  
  92.                     png.writeBytes(data);  
  93.                 }  
  94.                 var e:uint = png.position;  
  95.                 png.position = p;  
  96.                 c = 0xffffffff;  
  97.                 for (var i:int = 0; i < (e-p); i++) {  
  98.                     c = uint(crcTable[  
  99.                         (c ^ png.readUnsignedByte()) &   
  100.                         uint(0xff)] ^ uint(c >>> 8));  
  101.                 }  
  102.                 c = uint(c^uint(0xffffffff));  
  103.                 png.position = e;  
  104.                 png.writeUnsignedInt(c);  
  105.             }  
  106.         }  
  107. }  

 

 

 

然后,在as3文件中调用,将图片转换成ByteArray:

Java代码  收藏代码
  1. package  
  2. {  
  3. import flash.events.Event;  
  4. import flash.net.URLRequest;  
  5. import flash.display.Loader;  
  6. import flash.events.IOErrorEvent;  
  7. import flash.display.Bitmap;  
  8. import flash.display.BitmapData;  
  9. import flash.display.Sprite;  
  10. import flash.display.MovieClip;  
  11. import flash.utils.ByteArray;  
  12. //import mx.utils.Base64Decoder;  
  13. public class main extends MovieClip  
  14. {  
  15.    private var imgLoader:Loader= new Loader();;  
  16.    private var arr:Array;  
  17.    private var _bmd:BitmapData;  
  18.    public function main()  
  19.    {  
  20.   
  21.     imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onIMGComplete);  
  22.     imgLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);  
  23.     imgLoader.load(new URLRequest("1.jpg"));  
  24.   
  25.     arr=[];  
  26.    }  
  27.   
  28.    private function onIMGComplete(evt:Event):void   
  29.    {  
  30.         var _bitmap:Bitmap=evt.target.content;  
  31.          _bmd=_bitmap.bitmapData.clone();  
  32.           imgLoader.unload ();  
  33.   
  34.           var bytes:ByteArray=PNGEncoder.encode(_bmd);//转化为二进制数据    
  35.    }  
  36.    private function onError(evt:Event):void   
  37.    {  
  38.           trace('出错了!');  
  39.    }  
  40.     
  41. }  
  42. }  
  43.   
  44. 如果需要将ByteArray再转换成图片,代码如下:  
  45.   
  46. package  
  47. {  
  48. import flash.events.Event;  
  49. import flash.net.URLRequest;  
  50. import flash.display.Loader;  
  51. import flash.events.IOErrorEvent;  
  52. import flash.display.Bitmap;  
  53. import flash.display.BitmapData;  
  54. import flash.display.Sprite;  
  55. import flash.display.MovieClip;  
  56. import flash.utils.ByteArray;  
  57. public class main extends MovieClip  
  58. {  
  59.    private var imgLoader:Loader= new Loader();;  
  60.    private var arr:Array;  
  61.    private var _bmd:BitmapData;  
  62.    public function main()  
  63.    {  
  64.     imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onIMGComplete);  
  65.     imgLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);  
  66.     imgLoader.load(new URLRequest("1.jpg"));  
  67.   
  68.     arr=[];  
  69.    }  
  70.   
  71.    private function onIMGComplete(evt:Event):void   
  72.    {  
  73.         var _bitmap:Bitmap=evt.target.content;  
  74.     _bmd=_bitmap.bitmapData.clone();  
  75.         imgLoader.unload ();      
  76.     var bytes:ByteArray=PNGEncoder.encode(_bmd);//转化为二进制数据   
  77.     trace(bytes[0]);  
  78.     var load:Loader=new Loader();      
  79.     load.loadBytes(bytes);//读取ByteArray      
  80.     load.contentLoaderInfo.addEventListener(Event.COMPLETE, complete);      
  81.      
  82.    }  
  83.    private function complete(event:Event):void {      
  84.        var bitMap:Bitmap=event.target.content as Bitmap;//读取Bitmap      
  85.        addChild(bitMap);    }  
  86.    private function onError(evt:Event):void   
  87.    {  
  88.           trace('出错了!');  
  89.    }  
  90.     
  91. }  
  92. }  

 

分享到:  
 
posted @ 2012-07-21 12:23  rob_2010  阅读(1173)  评论(0编辑  收藏  举报