AS3 - Сжать ByteArray - PullRequest
       36

AS3 - Сжать ByteArray

2 голосов
/ 03 июля 2011

Из чертежа я генерирую PNG и загружаю его в виде строки Base64 через PHP на мой сервер. Можно ли сжать строку Base64 в AS3?

Это мой код:

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

Я надеялся немного ускорить процесс. Спасибо за любую информацию.

Ответы [ 2 ]

3 голосов
/ 03 июля 2011

Ваши данные PNG уже сжаты .Вы можете попытаться вручную сжать данные Base64, но вы снова получите двоичные данные, и результат не может быть меньше, чем исходные данные изображения.Если ваш сервер может принимать двоичные данные, тогда вы сэкономите больше места, пропустив кодировку Base64 и просто отправив необработанные данные изображения.

Кроме того, вы можете попробовать закодировать ваше изображение в формате JPEG вместо PNG, что позволит вам еще больше уменьшить размер данных, хотя и в ущерб качеству изображения.

1 голос
/ 03 июля 2011

Я думаю, что этот код может помочь вам:

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;
}
...