Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.05.2014, 15:45
non4me вне форума Посмотреть профиль Отправить личное сообщение для non4me Найти все сообщения от non4me
  № 1  
Ответить с цитированием
non4me

Регистрация: Jul 2005
Сообщений: 7
По умолчанию Снова base64 или как закодировать bitmap

Всем привет!

Требуется средствами 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 возращает только значение цвета для указаного пикселя. Не уверен что это вся информация которую нужно знать о пикселе при обратной реконструкции.

Поделитесь, пожалуйста, своим опытом решения данной задачи.

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.