Загрузка изображений в j2me - PullRequest
       11

Загрузка изображений в j2me

1 голос
/ 14 февраля 2012

У меня проблема с загрузкой изображений в j2me
Где я могу загрузить некоторые типы изображений для эмулятора j2me, но для некоторых он не загружается
Итак, в чем проблема?означает, какой тип изображений может быть загружен в класс, расширяющий класс Canvas?должен быть определенный размер или тип изображения для загрузки?

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Я думаю, проблема в одной из следующих причин:

1. Название ресурса:

Имена ресурсов чувствительны к регистру; например, / ellen-png.png - это не тот же ресурс, что и / ellen-png.PNG или любой другой вариант.

2.Format:

Единственный формат, который должен поддерживаться, это png. Некоторые телефоны могут поддерживать другие форматы, такие как:

  • Формат обмена графиками (GIF)
  • Объединенная группа экспертов по фотографии (JPEG, JPG)
  • Windows или OS / 2 Bitmap (BMP)
  • Тег Формат файла изображения (TIF)
  • Растровое изображение PC Paintbrush (PCX)
  • Необработанные данные PCM со знаком (RAW)

Но это зависит от устройства, и если вы хотите быть максимально кроссплатформенным, просто используйте pngs:
В 1999 году, когда Sun Microsystems разработала спецификацию платформы J2ME и поддерживающие ее API, PNG был выбран в качестве формата изображения по умолчанию из-за его графических возможностей, небольшого размера файла и того, что он не обременен патентными проблемами.
Чтобы определить, обрабатывает ли J2ME определенный формат мультимедиа, вы вызываете метод getSupportedContentTypes . Этот метод возвращает строковый массив поддерживаемых типов мультимедиа и включает форматы аудио и видео, а также форматы изображений. Строки представляют эту информацию в формате MIME-типа. Например, чтобы проверить поддержку GIF, вы сканируете этот массив в поисках строки GIF-MIME-типа. Если есть совпадение, то реализация J2ME телефона поддерживает собственное отображение файлов GIF. Этот фрагмент кода может использоваться для этой цели:

private String   mediaTypes[];   
private final    String GIF_MIME_TYPE = "image/gif";   
private boolean  gifSupported;    

// Get the media types to check for support of GIF file display   
mediaTypes = Manager.getSupportedContentTypes(null);   
int count = mediaTypes.length;   

// Check list for GIF MIME type; set support flag if present   
gifSupported = false;   
for (int i = 0; i < count; i++) {   
    if (mediaTypes[i] == GIF_MIME_TYPE)   
        gifSupported = true;   
} // end for   

Если вы хотите использовать специальный формат, вы можете использовать специальные декодеры для декодирования изображения из неподдерживаемого формата.
createImage бросает java.io.IOException , если ресурс не существует (особенно неправильное имя ресурса), данные не могут быть загружены, или данные изображения не могут быть декодированы. Поэтому, если вы ловите это исключение, проверяйте каждый случай.

3.Size:
Обратите внимание, что размеры файлов JAR, которые могут загружать конкретные устройства, зависят от множества факторов, включая ограничения, налагаемые производителями и операторами мобильных телефонов, или даже доступную конфигурацию памяти на конкретном устройстве. Размеры файлов изображений должны быть в диапазоне от 9,1 Кбайт для GIF до 69,5 Кбайт для TIF. Конечно, поскольку вы, вероятно, хотите сделать их как можно меньше, вы можете попробовать для этого инструмент, подобный pngcrush . Его основная цель - уменьшить размер потока данных PNG IDAT, пробуя различные уровни сжатия и методы фильтрации PNG.

Рекомендации:

SDN FAQ - Какие типы изображений поддерживает MIDP?
gamedev.net - Форматы изображений в J2ME
drdobbs.com - Отображение изображений GIF на мобильных телефонах J2ME

1 голос
/ 15 февраля 2012

Я не уверен, что именно вы ищете, но поведение, которое вы описываете, очень похоже на то, что вы испытываете исключение OutOfMemory. Попробуйте уменьшить размеры ваших изображений (использование кучи зависит от размера) и посмотрите, не прекращается ли поведение. Это позволит вам узнать, действительно ли это проблема OutOfMemory или что-то еще.

Другие советы:

1) Загрузка изображений от самых больших до самых маленьких. Это помогает при фрагментации кучи и обеспечивает наибольшее пространство кучи для самых больших изображений. 2) Выгрузить (установить в ноль) в обратном порядке, как вы загрузили и мусор после этого. Убедитесь, что Thread.yield () после вызова GC. 3) Убедитесь, что вы загружаете только те изображения, которые вам нужны. Выгрузить изображения из состояния, в котором больше нет приложения. 4) Поскольку вы создаете спрайты, у вас может быть несколько спрайтов для одного изображения. Рассмотрите возможность создания пула изображений, чтобы убедиться, что вы загружаете изображение только один раз. Затем просто наведите каждый объект Sprite на нужное ему изображение в пуле. Ваш пример в вашем вопросе кажется, что вы, скорее всего, загрузите одно и то же изображение в память несколько раз. Это расточительно и может быть частью проблемы OutOfMemory.

...