手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网页制作>Flash>列表

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

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  注:耗子英语水平一般,可能有写地方翻译(或许称不上翻译)的驴唇不对马嘴,但是希望大家能从这篇文章中学到一点东西:)呵呵。有纰漏的地方希望大家指正。关于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);

  }

  }


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!