Всем привет!
Требуется средствами AS2 (с AS3 проблем нет) конвертировать изображение (bitmap) в base64
К сожалению, ни Гугл, ни топики на этом форуме не смогли помочь понять окончательный алгоритм действий. Тем не менее появился следующий код:

Код AS1/AS2:
import flash.display.BitmapData;
var myClip:MovieClip = this.createEmptyMovieClip("myClip", this.getNextHighestDepth());
var loadListener:Object = new Object();
loadListener.onLoadInit = bitmap2base64;
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(loadListener);
mcLoader.loadClip("http://stat.karinin.ru/post/1001/01.gif", myClip);
function bitmap2base64 (clip:MovieClip):Void {
var bitmapImg:BitmapData = new BitmapData(clip._width, clip._height, false, 0xFFFFFF);
bitmapImg.draw(clip);
//Перегоняем битмап в пиксельный массив
var bitmapArray = [];
for( var j = 0; j <= clip._height; j++ ) {
for( var i = 0; i <= clip._width; i++ ) {
bitmapArray.push( bitmapImg.getPixel(i, j).toString(16) );
}
}
var bitmapString = bitmapArray.join("");
trace( bitmapArray );
trace( encode(utf8textToBytes(bitmapString)) );
}
function utf8textToBytes(text:String):Array
{
var l:Number = text.length;
var c:Number, p:Number = 0, b:Array = [];
for (var i:Number = 0; i < l; i++)
{
c = text.charCodeAt(i);
if (c <= 0x07F) {
b[p] = c;
p++;
}
else if (c <= 0x07FF) {
b[p] = (c >>> 6) | 0x0C0;
b[p + 1] = (c & 0x03F) | 0x080;
p += 2;
}
else if (c <= 0x0FFFF) {
b[p] = (c >>> 12) | 0x0E0;
b[p + 1] = ((c >>> 6 ) & 0x03F) | 0x080;
b[p + 2] = (c & 0x03F) | 0x080;
p += 3;
}
else if (c <= 0x010FFFF) {
b[p] = (c >>> 18) | 0x0F0;
b[p + 1] = ((c >>> 12) & 0x03F) | 0x080;
b[p + 2] = ((c >>> 6 ) & 0x03F) | 0x080;
b[p + 3] = (c & 0x03F) | 0x080;
p += 4;
}
}
return b;
}
function encode(bytes:Array):String
{
var chrs:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var l:Number = bytes.length;
var c1:Number, c2:Number, c3:Number;
var e1:Number, e2:Number, e3:Number, e4:Number;
var i:Number = 0, t:String = new String("");
while (i < l)
{
c1 = bytes[i++];
c2 = bytes[i++];
c3 = bytes[i++];
e1 = c1 >> 2;
e2 = ((c1 & 3) << 4) | (c2 >> 4);
e3 = ((c2 & 15) << 2) | (c3 >> 6);
e4 = c3 & 63;
t += chrs.charAt(e1) + chrs.charAt(e2);
if (i < l) t += chrs.charAt(e3);
if (i < l) t += chrs.charAt(e4);
}
if (isNaN(c2)) t += "=";
if (isNaN(c3)) t += "=";
return t;
}
Сама функия base64 работает абсолютно корректно. В чем можно убедиться если использовать как входные данные обычный текст.
Но данные полученные при помощи bitmapImg.getPixel(i, j).toString(16) в корректный base64 не конвертируются. Из чего можно сделать вывод что либо нужно использовать не getPixel, а какую то другую функцию. Какую? Либо полученный от нее результат нужно еще как то модифицировать. Как?
BTW. Видно что getPixel возращает только значение цвета для указаного пикселя. Не уверен что это вся информация которую нужно знать о пикселе при обратной реконструкции.
Поделитесь, пожалуйста, своим опытом решения данной задачи.