关于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二进制传到服务器端保存.