|
|
|||||
Регистрация: Feb 2009
Сообщений: 11
|
Быстрая обработка изображения
Одна часть вопроса уже была рассмотрена в теме "Редактирование изображений перед отправкой ", однако возникла еще одна проблема.
Общая схема редактирования такова: 1. Создание объекта BitmapData из ByteArray. 2. Манипуляция (масштабирование, поворот). 3. Перевод из BitmapData в ByteArray. Вот как-раз по этому пункту и есть главный вопрос. Использую JPEGEncoder, метод encode. Все работает, но скорость оставляет желать много лучшего. Причем, недавно довелось мне увидеть и использовать новую версию загрузчика изображений в социальной сети "ВКонтакте". Там, сразу после загрузки изображения пользователя во флеш, происходит масштабирование - прямо на клиенте - и занимает оно ...... - не более 5 секунд! Причем, пробовал туда подсунуть изображение ~5000*3000, обработка которого посредством моего скрипта занимает на 2*ядерном процессоре примерно полминуты. А тут - 3 сек. Странно. Может это Алхимия? Вобщем, очень хотелось бы услышать ваши мнения, может есть готовые паттерны или компоненты для решения такой задачи. Добавлено через 4 минуты Кстати, относительно разрешения той картинки: оно 5120*3250, что по докам флекса не приемлемо: Однако, работает нормально |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
А кто вам сказал, что процесс конвертации вконтакте происходит на клиентской стороне?
|
|
|||||
Регистрация: Feb 2009
Сообщений: 11
|
Цитата:
Например, для изображения размером в 3,5МБ, он говорит, что объем отправляемых данных - всего 23КБ. Причем, делается это все настолько оперативно, что я тоже сомневаюсь в редактировании на клиенте. Однако так... |
|
|||||
Modus ponens
|
Чего-то с вашим скриптом не так... делал следующее: загрузка последовательности картинок в формате BMP (т.е. не поддерживаем напрямую Loader'ом) микширование, отрисовка в новую картинку и отсылка обратно.
(понятно, что делалось это для того, чтобы отрендерить видео). По моим наблюдениям, даже не сильно оптимизированый код должен успеть сделать то, что вы описали на клиенте за 5 секунд... единственное, я использовал PNGEncoder, JPEGEncoder действительно дольше работает, а размер мне был не принципиален. Так что оптимизируйте... задача вполне выполнимая.
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Feb 2009
Сообщений: 11
|
Цитата:
Цитата:
Цитата:
|
|
|||||
Modus ponens
|
Да, примерно так:
C# приложение открывает какой-нть AVI, и высылает флешке покадрово через сокет (в реальности через несколько сокетов, для каждого видео отдельно). AVI несжатый ничем фактически от BMP не отличается. флешка принимает / комбинирует картинки по заданному сценарию / рендерит и отсылает обратно уже в PNG. Видео 30 фпс формата 640х480 рендерится таким способом (при условии, что есть всего 1 входящее видео + какая-нибудь незамысловатая графика / немного текста) примерно в соотношении 20 минут рендеринга на 15 секунд видео. т.е. получается 2.4 секунды на 307200 пикселей.
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Feb 2009
Сообщений: 11
|
В моем случае, простое декодирование в jpeg изображение 640*480 на флешке занимает от 0.5 до 1 секунды. Но, с большими разрешениями, разница получается просто геометрического порядка
Нашел вот такую ссылку: http://www.switchonthecode.com/tutor...s-jpeg-encoder. Видно, что проблема такая есть - обработка не быстрая, приходится использовать асинхронный вызов. Но все же интересно - как они "ВКонтакте" с такой проблемой и так изящно справились??? |
|
|||||
Modus ponens
|
Чего-то у вас не срастается... либо вы посылаете большую картинку и тогда ее не нужно кодировать, отправляем как есть, либо вы ее уменьшаете и после этого кодируете...
>> что объем отправляемых данных - всего 23КБ >> Кстати, относительно разрешения той картинки: оно 5120*3250, такая картинка будет столько весить если она Ч/Б и изображен на ней "черный квадрат Малевича"
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Feb 2009
Сообщений: 11
|
Это реальный пример: приложение обрабатывает (масштабирует) изображение, которое весит 3,5 МБ за 3-5 сек. В результате, его размер: 604px × 383px, вес - 18.3 КБ. Как за такое время можно так пожать картинку на клиенте при помощи флеша???
Последний раз редактировалось ix18; 15.02.2009 в 00:42. Причина: Пунктуационная ошибка =) |
|
|||||
Modus ponens
|
Ну так наверное сначала скейлить все-таки? Чего-то я вообще перестал понимать...
загрузили картинку, создали битмапдату нужного размера, отрисовали туда уменьшеную картинку, перекодировали... это ну никак не может занять больше нескольки секунд...
__________________
Hell is the possibility of sanity |
Часовой пояс GMT +4, время: 07:41. |
|
« Предыдущая тема | Следующая тема » |
Теги |
encoding , image |
|
|