代码如下:
-
/*
-
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二进制传到服务器端保存.