(ActionScript 3) Создание миниатюр с низким разрешением

Я пытаюсь создать галерею изображений, похожую на «Галерею» Android, где это горизонтальный прокручиваемый список изображений. Я делаю это с объектами HBox и Bitmap, завернутыми в UIComponent. Проблема в том, что я пытаюсь сделать это для мобильных устройств, и наличие большого количества полноразмерных изображений, открытых в памяти, вызывает проблемы. Я пытался, чтобы изображения загружались правильно, когда они прокручиваются в поле зрения, и выгружаются, когда они выходят из поля зрения, но загрузка/выгрузка во время прокрутки требует слишком много ресурсов процессора и вызывает очень прерывистый и плохой пользовательский интерфейс.

Что я хочу сделать, так это иметь возможность загружать в память несколько версий изображений низкого качества, поэтому мне не нужно делать столько загрузки/выгрузки. Я попытался уменьшить высоту/ширину, но, похоже, это не повлияло на использование памяти. Кто-нибудь знает библиотеку или класс AS, которые могут мне помочь?

Любая помощь будет принята с благодарностью. Спасибо


person jln646v    schedule 12.08.2011    source источник


Ответы (4)


Я не знаю, что сказал Гриффин, правда или нет, но я бы взял растровые данные и нарисовал их в другой объект растровых данных с конечной высотой и шириной, которые вы хотите, а затем используйте матрицу для масштабирования исходного изображения, пока вы нарисуйте новое растровое изображение.
После того, как вы создали новое растровое изображение, вы можете удалить и удалить все ссылки на исходное растровое изображение, что должно позволить его GCed.

Если вы перейдете здесь, вы сможете прочитать о том, как масштабировать матрицу.

person The_asMan    schedule 13.08.2011
comment
Спасибо, сейчас попробую это - person jln646v; 04.09.2011

Вы можете создавать новые растровые данные желаемого размера и использовать функцию bitmapdata.draw() для создания миниатюр меньшего размера. Хитрость заключается в использовании матрицы преобразования, когда вы вызываете функцию draw для уменьшения размера изображения.

Вот ссылка на класс Matrix: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Matrix.html

а вот ссылка на bitmapData.draw() http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#draw()

Если это не на 100% интуитивно понятно для вас, я рекомендую сделать простой swf, который просто берет изображение, а затем использует BitmapData.draw(myImage, myMatrix); для создания уменьшенной копии. Как только вы добьетесь нужного масштабирования, вы можете скопировать его в свое мобильное приложение.

person Plastic Sturgeon    schedule 13.08.2011
comment
Как вы предполагаете получить данные изображения из файла для BitmapData в первую очередь? Кроме того, объекты BitmapData требуют много памяти, поскольку это необработанное представление изображения. Это не тот путь. - person Griffin; 13.08.2011
comment
@griffin - Чтобы получить данные изображения. Вы начинаете с пустых растровых данных. затем bitmapdata.draw() заполнит его копией. Так что эта часть проста. Для объектов Bitmapdata требуется много памяти: нет другого способа хранить изображения во флэш-памяти. Итак, вы застряли с растровыми данными. Надеемся, что рисование маленьких эскизов на экране будет менее трудоемким, чем рисование на экране крупномасштабных изображений. Во флэш-памяти обычно наиболее интенсивной частью является отрисовка, а не данные. К тому же - вопрос задан как делать миниатюры. И вот как это делается. Возможно, Flash Player 11 предложит лучшее решение с использованием Stage3D. - person Plastic Sturgeon; 13.08.2011
comment
@Plastic Sturgeon вы можете загружать изображения через классы Loader и URLLoader. - Нет необходимости в BitmapData. - person Griffin; 13.08.2011
comment
Когда вы это сделаете, объект содержимого загрузчика будет объектом Bitmap. Этот BitmapObject имеет свойство BitmapData. КЭД. - person Plastic Sturgeon; 13.08.2011

Изменение ширины и высоты не требует большого объема памяти, поскольку загружается один и тот же файл изображения.

Actionscript не может обрабатывать сами файлы изображений, а только экземпляр данных во флэш-приложении. (т. е. вы можете сколько угодно передискретизировать объект растровых данных, но исходный файл все равно будет храниться в памяти).

Вам нужен какой-то язык на стороне сервера, чтобы изменить размер изображений для вас. Как PHP с библиотекой GD.

person Griffin    schedule 12.08.2011
comment
Вы уверены, что? Уверен, ты сможешь - person The_asMan; 13.08.2011
comment
smallDisplayObject.draw(большеDisplayObject, матрица); - person The_asMan; 13.08.2011
comment
Значит, @The_asMan biggerDisplayObject еще не в памяти? - person Griffin; 13.08.2011
comment
Оригинал кэшируется, нет необходимости кэшировать меньший. и да, чем больше в памяти, поэтому вы обнуляете его и теряете все ссылки на него. - person The_asMan; 15.08.2011

Спасибо за все ответы. Я играл с этим, и, кажется, нет разницы в том, что память используется AIR. Я ищу способ сохранить в памяти небольшую версию изображения с низким разрешением, поскольку наличие нескольких изображений с полным разрешением в памяти на мобильном устройстве использует все ресурсы.

person jln646v    schedule 23.09.2011