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

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.07.2010, 16:54
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 1  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
По умолчанию Как лучше показать окно ожидания во время JPEG-кодирования и сохранения?

Не придумал ничего лучше такого названия... Всё равно в пару слов не опишу.

Есть приложение, работающее в FP10. Приложение представляет из себя что-то типа графического редактора. Есть возможность сохранить результирующую картинку на локальный диск пользователя. Очень хочется сделать так, чтобы при нажатии на кнопку Save сперва выдавалось PopUp-окно с сообщением "Please, wait...", а потом, когда окно уже отрисовалось в приложении, начиналось JPEG-кодирование и сохранение картинки.
Если сделать такой вот простой код:
Код AS3:
var waitPopUp:IFlexDisplayObject = PopUpManager.createPopUp(this, WaitPopUp, true, PopUpManagerChildList.POPUP);
 
var bitmapData:BitmapData = (image.content as Bitmap).bitmapData;
var jpgEncoder:JPGEncoder = new JPGEncoder(100);
var byteArray:ByteArray = jpgEncoder.encode(bitmapData);
var file:FileReference = new FileReference();
file.save(byteArray, "result.jpg");
то PopUp-окно отрисоваться не успевает до того, как приложение начинает кодировать картинку в JPEG и отнимать 100% производительности. В итоге получается такое:
- нажатие на кнопку,
- ужасные тормоза,
- появление диалога Save File с проявившимся наконец-то PopUp-окном под ним.

В голову приходят варианты слушать события какие-то, либо ждать какое-то время, а потом кодировать файл, но это всё не проходит, потому что метод FileReference.save может быть выполнен только в обработчиках событий, связанных с действиями пользователя.
То есть, такой код:
Код AS3:
var timer:Timer = new Timer(Number(this.getStyle("modalTransparencyDuration")), 1);
 
timer.addEventListener(TimerEvent.TIMER,
	function(event:TimerEvent):void
	{
		event.target.removeEventListener(event.type, arguments.callee);
 
		var bitmapData:BitmapData = (image.content as Bitmap).bitmapData;
		var jpgEncoder:JPGEncoder = new JPGEncoder(100);
		var byteArray:ByteArray = jpgEncoder.encode(bitmapData);
		var file:FileReference = new FileReference();
		file.save(byteArray, "result.jpg");
	}
);
 
var waitPopUp:IFlexDisplayObject = PopUpManager.createPopUp(this, WaitPopUp, true, PopUpManagerChildList.POPUP);
 
timer.start();
в принципе работает так, как мне нужно, за исключением того, что FileReference.save вызывается в обработчике TimerEvent.TIMER и потому я имею такой результат:
- нажатие на кнопку,
- вывод PopUp-окна,
- ужасные тормоза,
- вместо диалога File Save я тут, как и положено, получаю ошибку нарушения безопасности.

Может кто-то сталкивался с подобными задачами? Можно ли это сделать как-то красиво? Или нужно будет разделять кодирование с сообщением "Wait..." и сохранение на два шага, чтобы сохранение вызывалось при щелчке на какую-то другую кнопку?
В виду того, что кодирование сильно загружает процессор, очень хотелось бы выводить пользователю сообщение о том, что Конец Света ещё не наступил.
Либо, возможно, кто-то знаком с хорошим JPEG-кодировщиком, который не "вешает" приложение?
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого


Последний раз редактировалось Хемуль; 21.07.2010 в 16:59.
Старый 21.07.2010, 18:06
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 2  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Есть же библиотеки для асинхронного кодирования.
В плоть до того что даже можно прогресс кодирования выводить юзеру.

http://segfaultlabs.com/devlogs/alch...-jpeg-encoding
http://www.switchonthecode.com/tutor...s-jpeg-encoder
__________________
trace("Остановите Землю, я сойду!!!");

Старый 21.07.2010, 19:01
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 3  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
2 Mur4ik:
Спасибо. Тоже пришёл к этому. ^_^
Взял один из JPEG Encoder'ов на Alchemy, выбрал подходящий себе из множества. Скорость работы внушает...
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого

Старый 21.07.2010, 20:38
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 4  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Недавно еще BlooDHounD делился своим детищем, тоже по описываемым скоростям впечатляет, но я не в курсе есть ли там поддержка асинхронности.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 21.07.2010, 21:02
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 5  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
2 Mur4ik:
Попробую сравнить, посмотреть, что быстрее. Спасибо.

UPD:
Решил таки использовать библиотеку BlooDHounD'а. Меньше занимает, чем то, что я нашёл + работает примерно так же или даже чуточку быстрее.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого


Последний раз редактировалось Хемуль; 23.07.2010 в 12:20.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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