AS3中的PNG编码—用FLASH生成PNG

2008-04-02 11:04:17来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  注:耗子英语水平一般,可能有写地方翻译(或许称不上翻译)的驴唇不对马嘴,但是希望大家能从这篇文章中学到一点东西:)呵呵。有纰漏的地方希望大家指正。关于PNG的编码模式,请大家自己在搜索引擎上进行查找AS3中的PNG编码! 作者:kaourantin.net

  我希望各位已使用过了AS3――给我带来了强烈震撼的编程语言!就象广告词中说的相同:“一切皆有可能”;对AS3来讲,真的是这样:)特别是在我们接触到新的类,比如ByteArray 和新的数据类型,比如UINT、INT。本文为这些特性提供了一个具体的实例,程式的代码并不完全是我所编写的,我只是修正了原来程式中的一些BUG。这是个单纯的PNG编码工具,但我们能够感受到他能为我们带来的强大功能:我们只需要输入一个bitmapdata数据,程式会为我们返回已进行完PNG编码的ByteArray数据。接下来我们能够做的更多,比如传送到我们的服务器,进行图片处理。原来我们要通过zlib进行烦琐的数据压缩,而现在,对AS3来说,这真的只是小菜一碟!

  这个类的具体用法如下,您只需要建立一个BitMapData类,然后通过以下方式使用本类就能够了:

  
varmyPNG:ByteArray=PNGEnc.encode(myBitmapData);


  怎么样!很简单吧?当然。我们能够通过继承使他工作的更好~那么让我们一起来看一下完成这些工作的类代码:

  
importflash.geom.*;

  importflash.display.*;

  importflash.util.*;

  publicclassPNGEnc

  {

  publicstaticfunctionencode(img:BitmapData):ByteArray

  {

  //建立输出用ByteArray类型数据

  varpng:ByteArray=newByteArray();

  //写入PNG头文档

  png.writeUnsignedInt(0x89504e47);

  png.writeUnsignedInt(0x0D0A1A0A);

  //建立IHDR数据块

  varIHDR:ByteArray=newByteArray();

  IHDR.writeInt(img.width);

  IHDR.writeInt(img.height);

  IHDR.writeUnsignedInt(0x08060000);

  //32位RGBA的处理

  IHDR.writeByte(0);

  writeChunk(png,0x49484452,IHDR);

  //建立IDAT数据块

  varIDAT:ByteArray=newByteArray();

  for(vari:int=0;i<img.height;i )

  {

  //nofilter

  IDAT.writeByte(0);

  varp:uint;

  if(!img.transparent)

  {

  for(varj:int=0;j<img.width;j )

  {

  p=img.getPixel(j,i);

  IDAT.writeUnsignedInt(uint(((p&0xFFFFFF)<<8)|0xFF));

  }

  }else{

  for(varj:int=0;j<img.width;j )

  {

  p=img.getPixel32(j,i);

  IDAT.writeUnsignedInt(uint(((p&0xFFFFFF)<<8)|(shr(p,24))));

  }

  }

  }

  IDAT.compress();

  writeChunk(png,0x49444154,IDAT);

  //建立IEND数据块

  writeChunk(png,0x49454E44,null);

  //返回PNG

  returnpng;

  }

  privatestaticvarcrcTable:Array;

  privatestaticvarcrcTableComputed:Boolean=false;

  privatestaticfunctionwriteChunk(png:ByteArray,type:uint,data:ByteArray)

  {

  if(!crcTableComputed)

  {

  crcTableComputed=true;

  crcTable=[];

  for(varn:uint=0;n<256;n )

  {

  varc:uint=n;

  for(vark:uint=0;k<8;k )

  {

  if(c&1)

  {

  c=uint(uint(0xedb88320)^uint(c>>>1));

  }else{

  c=uint(c>>>1);

  }

  }

  crcTable[n]=c;

  }

  }

  varlen:uint=0;

  if(data!=null)

  {

  len=data.length;

  }

  png.writeUnsignedInt(len);

  varp:uint=png.position;

  png.writeUnsignedInt(type);

  if(data!=null)

  {

  png.writeBytes(data);

  }

  vare:uint=png.position;

  png.position=p;

  varc:uint=0xffffffff;

  for(vari:int=0;i<(e-p);i )

  {

  c=uint(crcTable[(c^png.readUnsignedByte())&uint(0xff)]^uint(c>>>8));

  }

  c=uint(c^uint(0xffffffff));

  png.position=e;

  png.writeUnsignedInt(c);

  }

  }


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 从球形绳的制作学习简单三维

下一篇: Flash:打造您自己的专业时钟