Как загружать плитки из большого растрового изображения в Android?

Если у меня есть большой файл растрового изображения, который обычно генерирует исключение "Out of memory", как я могу загрузить его как плитки? например У меня есть изображение размером 10 000x10 000, я хочу разбить его на сетку размером 10x10 с пикселами размером 1000x1000 пикселей.

Я видел функцию Bitmap.createBitmap(sourceBitmap, x, y, width, height), но для исходного ввода требуется мое большое изображение.

Как я могу получить плитку из моего входного изображения без полной загрузки входного изображения?

Ответ 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

Если вам очень повезло, вы можете найти библиотеку, которая может загружать куски изображения из хранилища, а не загружать всю вещь. Это зависит от формата изображения и от того, какие библиотеки доступны для его чтения. Кроме того, библиотека, вероятно, будет написана на C, поэтому вам придется переносить ее на Java или использовать NDK.

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

Если ни один из этих вариантов не работает для вас, я думаю, вам не повезло.

Ответ 3

Если изображение хранится как сжатое растровое изображение, то практически невозможно вычислить, где находится конкретный регион изображения в файле. Чтобы найти конкретный регион, вы должны декодировать строку за строкой, отбрасывая результаты, пока не получите строку y. Затем вы продолжаете декодирование строк высот, отбрасывая пиксели слева от вашей координаты X и справа от ширины X +.... очень медленно, если вы панорамируете в нижней части большого растрового изображения.

Чтение между строками, кажется, что упомянутый ранее BitmapRegionDecoder() делает это в фоновом режиме, если "isShareable" истинно. В противном случае кажется, что он может распаковать изображение и сохранить несжатую копию. С 1 байт на пиксель потребуется 100 МБ для хранения растровой карты размером 10 000 × 10 000.