Можно ли нарезать растровое изображение на маленькие кусочки, не загружая все это в память? - PullRequest
19 голосов
/ 27 января 2011

Я работаю над приложением обработки изображений для Android, которое распознает нотацию музыки по изображениям, сделанным из музыкальных листов.

Я попытался загрузить все изображение в растровое изображение с помощью метода BitmapFactory.decodeFile (imgPath) , но из-за того, что в моем телефоне недостаточно памяти, я получаю ошибку «Размер кучи виртуальной машины». Чтобы обойти это, я хотел бы нарезать полное изображение на более мелкие кусочки, но я не уверен, как это сделать.

Я также видел, что было возможно уменьшить размер памяти растрового изображения с помощью свойства inSampleSize класса BitmapFactory.Option, но если я это сделаю, я не получу изображение с высоким разрешением Мне нужен процесс распознавания нотной записи.

Есть ли способ справиться с этим, не переходя в NDK?

Ответы [ 3 ]

29 голосов
/ 05 февраля 2011

Android 2.3.3 имеет новый API под названием android.graphics.BitmapRegionDecoder, который позволяет вам делать именно то, что вы хотите.

Вы, например, сделали бы следующее:

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);

Легко :)

1 голос
/ 30 января 2011

Если вы имеете дело с изображениями в формате JPEG, см. Мой ответ на этот вопрос , а также этот пример .

Я не знаю, насколько возможно получить libijg на Android, но если это так, то стоит попробовать.

1 голос
/ 29 января 2011

Если это с камеры, изображение, скорее всего, будет в формате JPEG. Вы можете использовать внешнюю библиотеку jpeg - либо в java, либо через NDK, что бы вы ни нашли - чтобы лучше контролировать и загружать ее по частям за раз. Если вам нужно это как android.graphics.Bitmap, тогда я подозреваю, что вам нужно будет перекодировать субизображение в PNG или JPEG и передать его в BitmapFactory.decodeByteArray(). (Если проблема связана с памятью, обязательно забудьте о ссылках на фрагменты растрового изображения, чтобы сборщик мусора мог работать эффективно.)

Эта же методика также будет работать, если входная графика имеет формат PNG или что-то еще, при условии, что вы можете найти подходящий код декодирования для нее.

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

...