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

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

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

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

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

Ответ 1

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);

Легко:)

Ответ 2

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

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

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

Ответ 3

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

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