Отображение большого PNG-изображения в приложении Adobe Air - PullRequest
1 голос
/ 24 декабря 2009

У меня есть минимальное приложение Adobe Air; это в основном s:SkinnableContainer внутри mx:WindowedApplication. У меня есть PNG-изображение размером 6000 x 9000 пикселей (~ 3,20 МБ), которое я хочу показать в SkinnableContainer. Обратите внимание, что s:SkinnableContainer является тегом из Flex 4 Beta3 (искровые компоненты).

Фон

Прежде чем я объясню проблему, немного предыстории этого приложения. Предполагается, что это приложение Air будет запускаться на стороне сервера и периодически проверять базу данных и читать разметку XML, которая описывает графическое содержимое (фон, дочерние изображения, дочерние текстовые узлы и т. Д.) SkinnableContainer. Эта разметка фактически происходит из веб-приложения Flex, которое используется конечными пользователями для создания этого графического содержимого. Предполагается, что это приложение Air будет использовать версии изображений с действительно высоким разрешением, используемые в веб-приложении Flex, и воссоздать версию графического контента с высоким разрешением, созданного конечным пользователем в браузере. Приложение Air в конечном итоге запишет содержимое SkinnableContainer в виде растрового изображения в файл.

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

Задача

Проблема, с которой я сталкиваюсь, заключается в том, что это изображение размером 3,20 МБ не отображается, если оно установлено в качестве источника s:Skin, примененного к SkinnableContainer. Если я использую уменьшенную версию изображения, которая имеет размеры 3000 x 4500 пикселей и 1,73 МБ, она будет отображаться в приложении. Я запускаю приложение в режиме отладки и не получаю никаких исключений при сбое большого изображения. Детские графические элементы SkinnableContainer отображаются в обоих случаях в порядке.

Дополнительные замечания по реализации:

  • Источником обложки является URL-адрес изображения, в настоящее время http://localhost/foo/bar.png. Я могу получить доступ к изображению, просто нажав на него из Firefox.
  • Я установил источник следующим образом: BitmapImage([get the skin].backgroundImage).source = "http://localhost/foo/bar.png";

Есть ли ограничение памяти, о котором я должен знать, которое обеспечивается Air? Это ошибка в одном из компонентов искры? Почему я не получаю никаких исключений? Самое главное, как мне это исправить?

1 Ответ

1 голос
/ 13 января 2010

Существует внутренний предел того, насколько большими могут быть объекты BitmapData, предположительно из-за того, как он выделяет для них память, поэтому я предполагаю, что загруженные изображения также сталкиваются с этим. Подробнее о лимите см. здесь .

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

...