2011-07-03 14 views
2

図面のうち、私はPNGを生成してPHP経由でBase64文字列としてサーバーにアップロードしています。 AS3でBase64文字列を圧縮することはできますか?AS3 - 圧縮ByteArray

これは私のコードです:

var png:ByteArray = PNGEncoder.encode(b); 
var myimage:String = Base64.encodeByteArray(png); 

私は少し物事をスピードアップするために期待していました。 ありがとうございます。

答えて

3

あなたのPNGデータはalready compressedです。 Base64データを手動で圧縮しようとする可能性がありますが、バイナリデータをもう一度使用すると、結果は元のイメージデータよりも小さくなることはありません。サーバーがバイナリデータを受け入れることができる場合は、Base64エンコーディングをスキップし、生のイメージデータを送信するだけで、ほとんどの領域を節約できます。

また、イメージをPNGの代わりにJPEGとしてエンコードしてみると、イメージの品質を犠牲にしてもデータのサイズをさらに縮小できます。

1

私は、このコードはあなたを助けることができると思う:

import flash.utils.ByteArray; 
import flash.display.Loader; 
import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.events.Event; 
import mx.utils.Base64Decoder; //Transform String in a ByteArray. 
import mx.utils.Base64Encoder; //Transform ByteArray in a readable string. 
import mx.graphics.codec.PNGEncoder; //Encode a BitmapData in a PNG; 

var myBMD:BitmapData=new myBitmapData(0,0); //In this case I had a BitmapData in the library so I took it from there. 

var myBMDByteArray:ByteArray=(new PNGEncoder).encode(myBMD); //Create the ByteArray of myBMD usinf the PNGEncoder. 

var compStr:String=compress(myBMDByteArray); //Creates String 
trace(compStr); 

// The loader acts exactly as we were loading an external PNG except the fact that we 
write the ByteArray. 

var loader:Loader = new Loader(); 

loader.loadBytes(uncompress(compStr)); // In the loadBytes we write the Base64 String of the image. 

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 

function loadComplete(e:Event):void 

{ 

    var bmp:BitmapData=new BitmapData(loader.width,loader.height,true,0x0); 

    bmp.draw(loader); 

    addChild(new Bitmap(bmp)); 

} 


// Compress a ByteArray into a Base64 String. 

function compress(bytes:ByteArray):String 

{ 

    var enc:Base64Encoder = new Base64Encoder();  
    enc.encodeBytes(bytes); 
    return enc.drain().split("\n").join(""); 
} 

// Uncompress a Base64 String into a ByteArray. 

function uncompress(str:String):ByteArray 
{ 

    var dec:Base64Decoder = new Base64Decoder(); 

    dec.decode(str); 

    var newByteArr:ByteArray=dec.toByteArray();   

    return newByteArr; 
}