Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Быстрая обработка изображения (http://www.flasher.ru/forum/showthread.php?t=121371)

ix18 14.02.2009 18:58

Быстрая обработка изображения
 
Одна часть вопроса уже была рассмотрена в теме "Редактирование изображений перед отправкой ", однако возникла еще одна проблема.

Общая схема редактирования такова:
1. Создание объекта BitmapData из ByteArray.
2. Манипуляция (масштабирование, поворот).
3. Перевод из BitmapData в ByteArray.

Вот как-раз по этому пункту и есть главный вопрос. Использую JPEGEncoder, метод encode. Все работает, но скорость оставляет желать много лучшего.

Причем, недавно довелось мне увидеть и использовать новую версию загрузчика изображений в социальной сети "ВКонтакте". Там, сразу после загрузки изображения пользователя во флеш, происходит масштабирование - прямо на клиенте - и занимает оно ...... - не более 5 секунд!

Причем, пробовал туда подсунуть изображение ~5000*3000, обработка которого посредством моего скрипта занимает на 2*ядерном процессоре примерно полминуты. А тут - 3 сек. Странно.

Может это Алхимия? Вобщем, очень хотелось бы услышать ваши мнения, может есть готовые паттерны или компоненты для решения такой задачи.

Добавлено через 4 минуты
Кстати, относительно разрешения той картинки: оно 5120*3250, что по докам флекса не приемлемо:
Код:

The maximum width and maximum height of a BitmapData object is 2880 pixels.
Однако, работает нормально :)

etc 14.02.2009 19:19

А кто вам сказал, что процесс конвертации вконтакте происходит на клиентской стороне?

ix18 14.02.2009 19:30

Цитата:

А кто вам сказал, что процесс конвертации вконтакте происходит на клиентской стороне?
Вопрос хороший. Это может быть и неправдой. Но после подгрузки изображения во флешку и нажатии кнопки "Отправить", он показывает размер отправляемой картинки.

Например, для изображения размером в 3,5МБ, он говорит, что объем отправляемых данных - всего 23КБ. Причем, делается это все настолько оперативно, что я тоже сомневаюсь в редактировании на клиенте. Однако так...

wvxvw 14.02.2009 20:05

Чего-то с вашим скриптом не так... делал следующее: загрузка последовательности картинок в формате BMP (т.е. не поддерживаем напрямую Loader'ом) микширование, отрисовка в новую картинку и отсылка обратно.
(понятно, что делалось это для того, чтобы отрендерить видео). По моим наблюдениям, даже не сильно оптимизированый код должен успеть сделать то, что вы описали на клиенте за 5 секунд... единственное, я использовал PNGEncoder, JPEGEncoder действительно дольше работает, а размер мне был не принципиален.
Так что оптимизируйте... задача вполне выполнимая.

ix18 14.02.2009 20:57

Цитата:

(понятно, что делалось это для того, чтобы отрендерить видео)
Покадрово в BMP?

Цитата:

По моим наблюдениям, даже не сильно оптимизированый код должен успеть сделать то, что вы описали на клиенте за 5 секунд... единственное, я использовал PNGEncoder, JPEGEncoder действительно дольше работает, а размер мне был не принципиален.
Да, я заметил, что PNGEncoder работал немного быстрее. Но ключевое слово - "немного". А какой у Вас был размер изображений, что они кодировались за 5 сек?

Цитата:

Так что оптимизируйте... задача вполне выполнимая.
Дык что тут оптимизировать, если самый узкий момент заключается в строке:
Код AS3:

source = jpegEncoder.encode(bitmapData);


wvxvw 14.02.2009 21:12

Да, примерно так:
C# приложение открывает какой-нть AVI, и высылает флешке покадрово через сокет (в реальности через несколько сокетов, для каждого видео отдельно). AVI несжатый ничем фактически от BMP не отличается. флешка принимает / комбинирует картинки по заданному сценарию / рендерит и отсылает обратно уже в PNG. Видео 30 фпс формата 640х480 рендерится таким способом (при условии, что есть всего 1 входящее видео + какая-нибудь незамысловатая графика / немного текста) примерно в соотношении 20 минут рендеринга на 15 секунд видео. т.е. получается 2.4 секунды на 307200 пикселей.

ix18 14.02.2009 21:38

В моем случае, простое декодирование в jpeg изображение 640*480 на флешке занимает от 0.5 до 1 секунды. Но, с большими разрешениями, разница получается просто геометрического порядка :(

Нашел вот такую ссылку: http://www.switchonthecode.com/tutor...s-jpeg-encoder. Видно, что проблема такая есть - обработка не быстрая, приходится использовать асинхронный вызов.

Но все же интересно - как они "ВКонтакте" с такой проблемой и так изящно справились???

wvxvw 14.02.2009 23:10

Чего-то у вас не срастается... либо вы посылаете большую картинку и тогда ее не нужно кодировать, отправляем как есть, либо вы ее уменьшаете и после этого кодируете...
>> что объем отправляемых данных - всего 23КБ
>> Кстати, относительно разрешения той картинки: оно 5120*3250,
такая картинка будет столько весить если она Ч/Б и изображен на ней "черный квадрат Малевича" :)

ix18 15.02.2009 00:42

Это реальный пример: приложение обрабатывает (масштабирует) изображение, которое весит 3,5 МБ за 3-5 сек. В результате, его размер: 604px × 383px, вес - 18.3 КБ. Как за такое время можно так пожать картинку на клиенте при помощи флеша???

wvxvw 15.02.2009 01:26

Ну так наверное сначала скейлить все-таки? Чего-то я вообще перестал понимать...
загрузили картинку, создали битмапдату нужного размера, отрисовали туда уменьшеную картинку, перекодировали... это ну никак не может занять больше нескольки секунд...


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

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