Сохраняем картинку из Flash посредством PHP (ActionScript 3)

Sorry, cannot display this file. Is it really an SWF file?
Описание: 

Всем привет!! Я думаю много кто задавался вопросом как сохранить изображение из 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

Теперь сохраняем всё , делаем публикацию 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

Исходник: 

Комментарии

Аватар пользователя vitkuz

Ну вот, осталось это прикрутить к твоему граффити ) И можно вконтакт продавать )

За пост спасибо ) ОЧЕНЬ ПОЛЕЗНО! Сам не знал, ща буду пробовать.

PS:
Хотел порекомендовать бесплатный хостинг с поддержкой php и MYSQL и без рекламы для подобных эксперементов

https://realms.biz/

C народом и сравнивать нечего! В сто тысяч раз лучше

dance3

Аватар пользователя SarGun

юху! то что нужно пасиб!

Аватар пользователя Aloran

Классный урок!!! Мне очень понравился!!!

clapping

Аватар пользователя TeT

Подскажите, а если использовать файл php не загружая его на сервер ? Можно сделать что бы сохранялось ?

Keyboard not found. Press any key to continue

Аватар пользователя Fly

Можно этот момент протестировать с помощью ДЕНВЕРа: denwer.ru

1) Админ всегда прав
2) Если админ не прав, смотри пункт 1

Мы в контакте - https://vkontakte.ru/club9573247
Не отвечаю на вопросы в личку касаемо Flash, у нас для этого есть форум

Аватар пользователя SarGun
Цитата: TeT

Подскажите, а если использовать файл php не загружая его на сервер ? Можно сделать что бы сохранялось ?

нет нельзя!!!

Аватар пользователя dr.S
Цитата: TeT

Подскажите, а если использовать файл php не загружая его на сервер ? Можно сделать что бы сохранялось ?

с пхп нельзя.
saveFile.save(...,"....png"); что-то вроде, например. с 10й версии плеера начиная - можно локально %)

Аватар пользователя Neirol

Можно, как уже сказал dr.S сначала сохранить с помощью saveFile, а относительный путь переделать в абсолютный и дать пользователю на скачку. =)

Написал программу? Проверь на ошибки. Исправил ошибки? Проверь еще раз. Нет ошибок? Ты плохой программист!<br /><br />https://prograph.ru/ - видео уроки по программированию в разных средах, а также справочники, программы и новости.<br />

Аватар пользователя tracker

Не скачиваются исходники :-(

Аватар пользователя Fly

Почему не скачиваются? Попробуйте правой кнопкой а потом выбрать сохранить как

1) Админ всегда прав
2) Если админ не прав, смотри пункт 1

Мы в контакте - https://vkontakte.ru/club9573247
Не отвечаю на вопросы в личку касаемо Flash, у нас для этого есть форум

Аватар пользователя besuhoff

плохо, что данные передаются в виде строки. получается, между клиентом и сервером неоправданно большой поток траффика идет, для сохранения 30-килобайтной картинки требуется почти мегабайт. оптимизировать бы

Аватар пользователя as3coder

А вот способ сохранения без участия сервера "Сохранение изображения на ActionScript 3.0"

as3coder.blogspot.com

Аватар пользователя aligarh

У меня 1/4 часть рисунка сохраняется нижний правый угол, не понял в чем дело

Аватар пользователя Dimansel

as3coder, спасибо большое!
этот способ намного удобней =)