·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]基于PNGEncoder实现PNG图片的透明

时间:2015-06-03 08:29酷播
[AS3]基于PNGEncoder实现PNG图片的透明

AS3]基于PNGEncoder实现PNG图片的透明

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

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器