代码改变世界

用as3实现图片数据保存

2008-11-18 23:14  宝宝合凤凰  阅读(2526)  评论(0)    收藏  举报

用as3实现图片数据保存:

PNGEncoder.as

 程序代码
package
{
        import flash.geom.*;
        import flash.display.*;
        import flash.utils.*;
        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;
                    if ( !img.transparent ) {
                        for(var j:int=0;j < img.width;j++) {
                            p = img.getPixel(j,i);
                            IDAT.writeUnsignedInt(
                                uint(((p&0xFFFFFF) << 8)|0xFF));
                        }
                    } else {
                        for(var k:int=0;k < img.width;k++) {
                            p = img.getPixel32(k,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) {
                if (!crcTableComputed) {
                    crcTableComputed = true;
                    crcTable = [];
                    for (var n:uint = 0; n < 256; n++) {
                        var c_1:uint = n;
                        for (var k:uint = 0; k < 8; k++) {
                            if (c_1 & 1) {
                                c_1 = uint(uint(0xedb88320) ^
                                    uint(c_1 >>> 1));
                            } else {
                                c_1 = uint(c_1 >>> 1);
                            }
                        }
                        crcTable[n] = c_1;
                    }
                }
                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;
                var c:uint = 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);
            }
        }
}


swf的代码:

 程序代码
var url:String = "savePic.asp";

var bpd:BitmapData = new BitmapData(a_mc.width, a_mc.height);
bpd.draw(a_mc);
var dat:ByteArray = PNGEncoder.encode(bpd);


var request:URLRequest = new URLRequest(url);
request.contentType = "application/octet-stream";
request.data = dat;
request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
loader.dataFormat=URLLoaderDataFormat.BINARY;
try {
    loader.load(request);
} catch (error:ArgumentError) {
    trace("An ArgumentError has occurred.");
} catch (error:SecurityError) {
    trace("A SecurityError has occurred.");
}

 

asp代码:
 程序代码
<%
dim strSaveFileName
dim strNow
strnow =replace(replace(replace(now(), ":", ""), "-", ""), " ", "")
if request.servervariables("REQUEST_METHOD")="POST" then '当前为post
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize) '接收数据到FormData
strSaveFileName =strNow &".png"
set dr=CreateObject("Adodb.Stream")
dr.Mode=3
dr.Type=1
dr.Open
dr.Write(FormData)
dr.SaveToFile Server.MapPath(strSaveFileName),2
dr.Close
set dr=nothing
response.Write(strSaveFileName)
end if
%>


===========
这里还有jsp的代码:

 程序代码
<%@ page contentType="text/html; charset=utf-8" language="java"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%
int v;
String filePath = request.getRealPath(System.currentTimeMillis()+".jpg");
BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream());
FileOutputStream outputStream = new FileOutputStream(new File(filePath));
byte [] bytes = new byte[1024];
while((v=inputStream.read(bytes))>0){
        outputStream.write(bytes,0,v);
}
outputStream.close();
inputStream.close();
%>


php的代码:

 程序代码
<?
$data = file_get_contents('php://input');

echo file_put_contents("2.png",$data);
?>


dot net 的代码:

 程序代码
Stream pngFile = Request.InputStream;
        int v;
        string path = Server.MapPath("Test.png");
         byte[] arrayByte = new byte[1024];

        // Create the new, empty data file.
        if (File.Exists(path))
        {
            Response.Write("already exists!");
            return;
        }
        FileStream fs = new FileStream(path, FileMode.CreateNew);
        while ((v = pngFile.Read(arrayByte, 0, 1024)) > 0)
        {
            fs.Write(arrayByte, 0, v);
        }
        fs.Close();


文件下载

实现png透明
只用在 new BitmapData()里加上最后一个参数赋值为0x00就可以了.
var bpd:BitmapData = new BitmapData(a_mc.width, a_mc.height,true,0x00);

 

只用在 new BitmapData()里加上最后一个参数赋值为0x00就可以了.经试验正确无误.

var myBitmapData:BitmapData = new BitmapData(480, 360,true,0x00);
myBitmapData.draw(_base);

package
{
        import flash.geom.*;
        import flash.display.*;
        import flash.utils.*;
        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;
                    if ( !img.transparent ) {
                        for(var j:int=0;j < img.width;j++) {
                            p = img.getPixel(j,i);
                            IDAT.writeUnsignedInt(
                                uint(((p&0xFFFFFF) << 8)|0xFF));
                        }
                    } else {
                        for(var k:int=0;k < img.width;k++) {
                            p = img.getPixel32(k,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) {
                if (!crcTableComputed) {
                    crcTableComputed = true;
                    crcTable = [];
                    for (var n:uint = 0; n < 256; n++) {
                        var c_1:uint = n;
                        for (var k:uint = 0; k < 8; k++) {
                            if (c_1 & 1) {
                                c_1 = uint(uint(0xedb88320) ^
                                    uint(c_1 >>> 1));
                            } else {
                                c_1 = uint(c_1 >>> 1);
                            }
                        }
                        crcTable[n] = c_1;
                    }
                }
                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;
                var c:uint = 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);
            }
        }
}


文章来自: 闪客居(www.flashas.net) 详文参考:http://www.flashas.net/html/flashas/flashheWEBchengxuyingyong/20080807/3555.html