关于AS3的png图片编码器:
代码如下:
-
/*
-
Adobe Systems Incorporated(r) Source Code License Agreement
-
Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved.
-
Please read this Source Code License Agreement carefully before using
-
the source code.
-
Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive,
-
no-charge, royalty-free, irrevocable copyright license, to reproduce,
-
prepare derivative works of, publicly display, publicly perform, and
-
distribute this source code and such derivative works in source or
-
object code form without any attribution requirements.
-
The name "Adobe Systems Incorporated" must not be used to endorse or promote products
-
derived from the source code without prior written permission.
-
You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and
-
against any loss, damage, claims or lawsuits, including attorney's
-
fees that arise or result from your use or distribution of the source
-
code.
-
THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT
-
ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
-
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF
-
NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA
-
OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF
-
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
*/
-
package com.adobe .images
-
{
-
import flash.geom .*;
-
import flash.display .Bitmap ;
-
import flash.display .BitmapData ;
-
import flash.utils .ByteArray ;
-
-
public class PNGEncoder
-
{
-
public static function encode( img:BitmapData) :ByteArray {
-
// Create output byte array
-
var png:ByteArray = new ByteArray( ) ;
-
// Write PNG signature
-
png.writeUnsignedInt ( 0x89504e47) ;
-
png.writeUnsignedInt ( 0x0D0A1A0A) ;
-
// Build IHDR chunk
-
var IHDR:ByteArray = new ByteArray( ) ;
-
IHDR.writeInt ( img.width ) ;
-
IHDR.writeInt ( img.height ) ;
-
IHDR.writeUnsignedInt ( 0x08060000) ; // 32bit RGBA
-
IHDR.writeByte ( 0 ) ;
-
writeChunk( png,0x49484452,IHDR) ;
-
// Build IDAT chunk
-
var IDAT:ByteArray= new ByteArray( ) ;
-
for ( var i:int =0 ;i < img.height ;i++) {
-
// no filter
-
IDAT.writeByte ( 0 ) ;
-
var p:uint;
-
var j:int ;
-
if ( !img.transparent ) {
-
for ( j=0 ;j < img.width ;j++) {
-
p = img.getPixel ( j,i) ;
-
IDAT.writeUnsignedInt (
-
uint( ( ( p&0xFFFFFF) << 8 ) |0xFF) ) ;
-
}
-
} else {
-
for ( j=0 ;j < img.width ;j++) {
-
p = img.getPixel32 ( j,i) ;
-
IDAT.writeUnsignedInt (
-
uint( ( ( p&0xFFFFFF) << 8 ) |
-
( p>>>24 ) ) ) ;
-
}
-
}
-
}
-
IDAT.compress ( ) ;
-
writeChunk( png,0x49444154,IDAT) ;
-
// Build IEND chunk
-
writeChunk( png,0x49454E44,null ) ;
-
// return PNG
-
return png;
-
}
-
private static var crcTable:Array ;
-
private static var crcTableComputed:Boolean = false ;
-
private static function writeChunk( png:ByteArray,
-
type :uint, data :ByteArray) :void {
-
if ( !crcTableComputed) {
-
crcTableComputed = true ;
-
crcTable = [ ] ;
-
var c:uint;
-
for ( var n:uint = 0 ; n < 256 ; n++) {
-
c = n;
-
for ( var k:uint = 0 ; k < 8 ; k++) {
-
if ( c & 1 ) {
-
c = uint( uint( 0xedb88320) ^
-
uint( c >>> 1 ) ) ;
-
} else {
-
c = uint( c >>> 1 ) ;
-
}
-
}
-
crcTable[ n] = c;
-
}
-
}
-
var len:uint = 0 ;
-
if ( data != null ) {
-
len = data .length ;
-
}
-
png.writeUnsignedInt ( len) ;
-
var p:uint = png.position ;
-
png.writeUnsignedInt ( type ) ;
-
if ( data != null ) {
-
png.writeBytes ( data ) ;
-
}
-
var e :uint = png.position ;
-
png.position = p;
-
c = 0xffffffff;
-
for ( var i: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) ;
-
}
-
}
-
}
如何使用:
Flex Paint (需要Flash 9)
1、如图设置界面;
2、定义一个BitmapData 对象
var bd:BitmapData = new BitmapData(canvas.width,canvas.height);
3、将canvas中的像素拷贝到这个对象里
bd.draw(canvas);
4、然后将BitmapData 转换成png格式的ByteArray 对象
5、将最后的png二进制传到服务器端保存.
来自:http://www.cnblogs.com/FireYang/archive/2007/02/10/646839.html