ГлавнаяПо делу › Декодирование картинки из Base64 и вывод полученого изображения во Flash.

Декодирование картинки из Base64 и вывод полученого изображения во Flash.

December 29th, 2008

Текст без слов или изображение без пикселов

Проще говоря речь пойдет о том, как во Flsh загрузить обычный текст и получнить из него картинку. Куда это применить решайте сами. Допустим у вас есть некий каталог товаров с картинками на CD. И если уж очень нужно сделать так что бы эти картинки нельзя было подменить другими или отредактироваными — то это как раз и будет решение этой задачи. А если еще добавить несложную перетасовку текста, то подменить изображение будет сложновато.
Цель написания даного текста лиш одна — сказать о том что такой фокус возможен с появлением ActionScript 3.0.

Не надо только путать с ASCII art. Кстати в справке по Flash CS3 найдена такая статья

Programming ActionScript 3.0>Working with strings Example: ASCII art
Теоретически можно рисовать… точнее составлять вот таких вот Шреков :)


                   ,-'     `._
                 ,'           `.        ,-.
               ,'                      ),.
     ,.       /                       /(  ;
    /'\     ,o.        ,ooooo.     ,'  `-')
    )) )`. d8P"Y8.    ,8P"""""Y8.  `'  .--"'
   (`-'   `Y'  `Y8    dP       `'     /
    `----.(   __ `    ,' ,---.       (
           ),--.`.   (  ;,---.        )
          / O_,' )     O_,'        |
         ;  `-- ,'       `---'        |
         |    -'         `.           |
        _;    ,            )          :
     _.'|     `.:._   ,.::" `..       |
  --'   |   .'     """         `      |`.
        |  :;      :   :     _.       |`.`.-'--.
        |  ' .     :   :__.,'|/       |  
        `     --.__.-'|_|_|-/        /   )
              _   `--^"__,'        ,    |
   -hrr- ;  `    `--^---'          ,'     |
            `                    /      /
              `    _ _          /
                       `       /
                        '    ,'
              `.       ,   _,'
                `-.___.---' 

Ниже речь идет об аналогах PHP функций base64_decode и base64_encode для Flash. В приложеном коде реализована только base64_decode и сделано это весьма криво (хотя и работает).
Итак. Писать дальше мне лень. Если в кратце, то повторим такой порядок действий:
    1. Берем картинку в формате (GIF/JPG/JPEG/PNG) размером меньше 20Kb.
    2. Используя форму ниже с помощю PHP скрипта кодируем ее в Base64.
    3. Полученый текст вставляем в поле ввода Flash приложения.
    4. Нажимаем кнопку “Decode”. Получаем декодируваную из Base64 картинку.
Как это использовать думайте сами.

Кратко о Base64

Base 64 буквально означает — позиционная система счисления с основанием 64. Здесь 64 — это наибольшая степень двойки (26), которая может быть представлена с использованием печатных символов ASCII. Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма. Все широко известные варианты, известные под названием Base64, используют символы A-Z, a-z и 0-9, что составляет 62 знака, для остальных двух знаков в разных системах используются различные символы.
В формате электронной почты MIME base64 — это схема, по которой произвольная последовательность байт преобразуется в последовательность печатных ASCII символов. Это определяет MIME как транспортное кодирование содержимого для использования в электронной почте. Используются только символы латинского алфавита в верхнем и нижнем регистре — символы (A—Z, a—z), цифры (0—9), и символы «+» и «/», с символом «=» в качестве специального кода суффикса.

Подробнее на русском можно прочитать здесь а так же на английском здесь.

Flash приложение

Пример приложения

Форма для кодирования изображения в Base64

 
Выберите файл картинку в формате (GIF/JPG/JPEG/PNG размером не больше 20Kb) что бы кодировать ее в Base64:     

Код использованый в примере

var ascii_chars_array:Array=new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                                         'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b',
                                         'c','d','e','f','g','h','i','j','k','l','m','n','o','p',
                                         'q','r','s','t','u','v','w','x','y','z','0','1','2','3',
                                         '4','5','6','7','8','9','+','/');
//


function buildPairs():Object {
        var obj:Object=new Object();
        for (var i:Number=0; i < ascii_chars_array.length; i++) {
                obj[ascii_chars_array[i]]=i;
        }
        return obj;
}
var pairs_obj:Object= buildPairs();
//
function decodeToBinary(block_arr:Array):ByteArray {
        var block_bytes:ByteArray=new ByteArray();
        var ch1:uint=pairs_obj[block_arr.toString().charAt(0)];
        var ch2:uint=pairs_obj[block_arr.toString().charAt(2)];
        var ch3:uint=pairs_obj[block_arr.toString().charAt(4)];
        var ch4:uint=pairs_obj[block_arr.toString().charAt(6)];
        block_bytes.writeByte(ch1 << 2 | ch2 >> 4);
        if (block_arr.toString().charAt(2) != "=") {block_bytes.writeByte(ch2 << 4 | ch3 >> 2);	}
        if (block_arr.toString().charAt(3) != "=") {block_bytes.writeByte(ch3 << 6 | ch4); }
        return block_bytes;
}
function decodeString(s:String):ByteArray {
        var base64_str:String=s;
        var base64_bytes:ByteArray=new ByteArray();
        var postion_array:Array=new Array();
        var leng:uint=base64_str.length;
        for (var i:uint=0; i <leng; i++) {
                var char:String=base64_str.charAt(i);
                postion_array.push(char);
                if (postion_array.length == 4) {
                        base64_bytes.writeBytes(decodeToBinary(postion_array));
                        postion_array=new Array();
                }
        }
        return base64_bytes;
}
//Вот так вот выглядит эта :) такртинка в виде Base64
var base64_img_str:String="iVBORw0KGgoAAAANSUhEUgAAABUAAAAWCAIAAACg4UBvAAAAA3NCSVQICA
jb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAFnRFWHRDcmVhdGlvbiBUaW1lADA1LzA1LzA35V+tVgAAABh
0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzT7MfTgAAA1BJREFUOI1tVE9o21Yc/iRLTqzYTkOyLYTqMBqs
Q50l4FJo11K2QteymTkM6kAOG0sxHf0zNqjdw07byUxh0JJDGGyBUUh8KaSwW0kYa06BpetgdprDqBMTmjgk0
pNk/X07KFZcOx9I6Pfxvt/ve4+nj6GUogOF8ZFOsvj4RSfJtOpbZSE2fu7jd0Xpvfrm6srvW0RRjm9Em8hnkp
qiBOWrcvn762e12hV56nIrrylKPpMMSjaY/OV3c0IsBkBX1WqlIkqScGJs+huSOHtdiMWqlYquqgCEWOzCtTt
HToPhQftcKpVLpRZnZ1+Vy7lUSlOUeVnOpVJfX7rkGymvrgbr2WAjfnv/DaBaqfgfQixmqCoAg5B6reaTrs75
Fjjf/IUPe9eWl8+n0wNDQ1/Jcr1WO5dOl6anRy8OrTx58kkuJyYSJyVJlCQAa8vLF6+yK380/eczSa12TZ766
K+lpeBgFmdn5RtXqVGUb3wa8JqiPFtclKc+0LbO7P97Op9JMvlM8v6PfX2D/WB6Fx7W15/zQvwtXdlJjHVl7y
bg/Qdg4cH6+t8DQnyovlUZfZ9kbwEAeW39cI9yAIQoC7AAm717CkwvmB5QEd5L2EuADiB7C8AeGB2UtN0fDgC
o/3iAC7jw9uCugu6/udIENVtr/+KxAFzbAXUWHm49LW3CI3CedYiPMFdEdQMAPKeptw0DMLO345Go+7T0HDCO
VeoECzO4/BnEYTgNzzG9pl43LI3AI+ev7Jw8pc4VsbvdLl77E6UZpD+HOAwApuZYune4//V/nNORA767wbCMN
AZxGKUZAOgfPBRXNyCN4ovCYWlprqk4JrEBnqGUFsZHvr3vRN/me/rDwcDdbdS3AUAchhA9MuLaHnltkR37wU
/h4uMXnM9ublgiC+pC6OfYEAtgYBADg2iDbbj6nq3V7d2aBYQR/P+F8ZGbOT3Sx0d6ue44xwus3yWAY7kW8Ro
HtnHgGvvWz79G/RQ4yo/C+MjkBOl7h+/qCfERlutiQzwLgFLq2tQxXMvwTNVuqO4vv8WCCGnPn8kJIkTAdbOh
cCjEMQCoB8+lTsO1DNe0mUfz0db8eUOPZoRNThBb8/xjoxQ6oeFo6NF8FB0p2K5v7dKGY/Pzf4k47RuDcix4A
AAAAElFTkSuQmCC";
//
var ld:Loader=new Loader();
ld.loadBytes(decodeString(base64_img_str));
ld.x = 20;
ld.y = 20;
addChild(ld);

//
var label = new TextField();
label.text = base64_img_str;
label.width =410;
label.height =150;
label.type ="input";
label.x =180;
label.y =30;
label.wordWrap = true;
label.background = true;
label.border = true;
label.restrict = "A-Z0-9a-z+/=";
addChild(label);
//
enc_mc.stop();
clear_mc.stop();
//
enc_mc.addEventListener(MouseEvent.MOUSE_OVER, onMouseover);
enc_mc.addEventListener(MouseEvent.MOUSE_OUT, onMouseout);
enc_mc.addEventListener(MouseEvent.MOUSE_DOWN, encodeText);
enc_mc.addEventListener(MouseEvent.MOUSE_UP, onMouseup);
//
clear_mc.addEventListener(MouseEvent.MOUSE_OVER, onMouseover);
clear_mc.addEventListener(MouseEvent.MOUSE_OUT, onMouseout);
clear_mc.addEventListener(MouseEvent.MOUSE_UP, onMouseup);
clear_mc.addEventListener(MouseEvent.MOUSE_DOWN, clearText);
//
function onMouseover(event:MouseEvent) {event.target.gotoAndStop(2);}
function onMouseout(event:MouseEvent) {event.target.gotoAndStop(1);}
function onMouseup(event:MouseEvent) {event.target.gotoAndStop(1);}
function clearText(event:MouseEvent) {label.text="";}
//
function encodeText(event:MouseEvent) {
        enc_mc.gotoAndStop(3);
        var str:String = label.text;
        if (str.length>100) {
                ld.loadBytes(decodeString(str));
        }
}

Исходные файлы для скачивания (Source code for download)

Скачать 8Kb

Категория: По делу

Смотрите также

Flash для начинающих. Здравствуй йолка новый год! Или отсчёт оставшегося времени до нового года (а так же любой другой даты) Страшный XML для безстрашных пионеров начинающих флеш разработчиков.
  1. Пока без комментариев.
  1. Пока нету.