Сохраняем картинку из Flash посредством PHP (ActionScript 3)
Всем привет!! Я думаю много кто задавался вопросом как сохранить изображение из Flash в файл(в этом уроке в файл *.jpg). Так же, в этом уроке я использую ООП (Объектно Ориентированное Программирование), т.е. Мы напишем класс SaveToFile, который будет собирать информацию о цветах пикселей мувиклипа и отправлять в скрипт PHP.
У ВАС ОБЯЗАТЕЛЬНО ДОЛЖЕН СТОЯТЬ СЕРВЕР ПОДДЕРЖИВАЮЩИЙ СКРИПТЫ PHP(У меня стоит Apache 2.0.58).
Если Вы не знакомы с классами — советую сначала изучить!
Поехали...
Для начала создайте папку где будут находится все файлы, к примеру saveImage. Далее в этой папке создайте ещё папку с именем src(в ней будет находится наш класс).
Создайте новый проэкт ActionScript 3 и сохраните его в папку saveImage под именем SaveToFile.fla. Теперь, рисуем на рабочем поле что угодно, что Вы хотите сохранить, или импортируйте картинку. Теперь переводим картинку в мувиклип и даём ему имя mc. Теперь создадим динамическое текстовое поле для сообщений от скрипта, и присвоим ему имя status_txt. Сдесь осталось добавить кнопку, при нажатии которой и будет происходить сохранение. Для это перетащите из списка компонентов компонент Button и присвойте ему имя save_btn. Вот что у меня вышло:
В свойствах рабочего поля впишем используемый класс, который мы далее напишем:
Теперь создаём файл ActionScript file:
И сохраняем в папку src под именем SaveToFile.
И пешем в нём этот код:
package src{ /////// ИМПОРТ ВСПОМОГАТЕЛЬНЫХ КЛАССОВ ////////// import flash.display.Sprite; import flash.geom.Rectangle; import flash.events.*; import flash.display.BitmapData; import flash.utils.ByteArray; import flash.net.*; ///////////////////////////////////////////////// ////// ОБЪЯВЛЕНИЕ КЛАССА ////// public class SendToFile extends Sprite { ////// ОБЪЯВЛЕНИЕ СВОЙСТВ КЛАССА ///////// private var myBitmapData:BitmapData; private var byteArr:ByteArray; ////////////////////////////////////////// ////// КОНСТРУКТОР КЛАССА //////////////// public function SendToFile():void { //новый объект BitmapData с размерами равными мувиклипу на рабочем поле myBitmapData=new BitmapData(mc.width,mc.height); //отрисовываем в объект BitmapData мувиклип myBitmapData.draw(mc); //слушаем событие нажатия на кнопку сохранить save_btn.addEventListener(MouseEvent.MOUSE_DOWN, downSave); } ////////////////////////////////////////// //////// ОБЪЯВЛЕНИЕ МЕТОДОВ КЛАССА /////// //функция при нажатии на кнопку сохранить private function downSave(e:MouseEvent):void{ //вызов функции организующей массив пикселей и //отправляющей его в PHP скрипт saveImage(); } //функция отправки картинки в скрипт private function saveImage():void { //массив для пикселей var pixels:Array = new Array(); //ширина картинки var w:Number=mc.width; //высота картинки var h:Number=mc.height; //перебираем все пиксели и добавляем их в массив pixels for (var a:int = 0; a <= w; a++) { for (var b:int = 0; b <= h; b++) { //записываем значение цвета пикселя в 16-ричной форме var tmp=myBitmapData.getPixel(a,b).toString(16); pixels.push(tmp); } } //путь для скрипта var url:URLRequest=new URLRequest("save.php"); //создаём объект данных, которые будем отправлять var variables:URLVariables = new URLVariables(); //добавляем в объект данных переменную img в которую //записываем массив пикселей и сразу переводим массив в строку variables.img=pixels.toString(); //добавляем в объект данных высоту картинки variables.height=h; //добавляем в объект данных ширину картинки variables.width=w; //присваиваем объект данных variables в качестве передаваемых данных url.data=variables; //указываем метод отправки url.method=URLRequestMethod.POST; //создаём объект URLLoader var loader:URLLoader = new URLLoader(); //даём знать что возвращённые данный будут текстом loader.dataFormat=URLLoaderDataFormat.TEXT; //отправляем loader.load(url); //слушатель завершения отправки loader.addEventListener(Event.COMPLETE, saveComplete); //пока картинка сохраняется виден текст Сохранение... status_txt.text = "Сохранение..."; } //функция завершения отправки function saveComplete( e:Event ):void { var loader:URLLoader=URLLoader(e.target); //присваиваем текстовому полю текст переданный скриптом status_txt.text=loader.data; } ////////////////////////////////////////// } /////////////////////////////// }
Теперь сохраняем всё , делаем публикацию swf и html. Остальное дело за скриптом PHP.
Создаём в папке saveImage текстовый документ и пишем в него:
<?php $data = explode(",", $_POST['img']); $width = $_POST['width']; $height = $_POST['height']; $image=imagecreatetruecolor( $width ,$height ); $background = imagecolorallocate( $image ,0 , 0 , 0 ); //Copy pixels $i = 0; for($x=0; $x<=$width; $x++){ for($y=0; $y<=$height; $y++){ $int = hexdec($data[$i++]); $color = ImageColorAllocate ($image, 0xFF & ($int >> 0x10), 0xFF & ($int >> 0x8), 0xFF & $int); imagesetpixel ( $image , $x , $y , $color ); } } //picture.jpg - имя(можно любое) $rr=imageJPEG($image, "picture.jpg", 100); if($rr){ //эта строка передаётся во флеш если картинка сохранена успешно echo('Ваше фото успешно сохранено'); }else{ echo('Не удалось сохранить фото'); } imagedestroy( $image );
Вот и всё! Закидываем файлы на сервер и проверяем!
Если всё правильно сделали в текстовом поле выдается текст:
Исходные файлы:
Возникнут вопросы обращайтесь... )
icq: 420260217
Регистрация: 17.07.2008
Публикаций: 100
Комментариев: 164
За пост спасибо ) ОЧЕНЬ ПОЛЕЗНО! Сам не знал, ща буду пробовать.
PS:
Хотел порекомендовать бесплатный хостинг с поддержкой php и MYSQL и без рекламы для подобных эксперементов
https://realms.biz/
C народом и сравнивать нечего! В сто тысяч раз лучше