Обрезать растровое изображение без предварительного чтения всего растрового изображения - PullRequest
5 голосов
/ 21 июля 2010

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

Uri data = getIntent().getData();
InputStream is = getContentResolver().openInputStream(data);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null);

Любая помощь будет отличной?

Ответы [ 3 ]

2 голосов
/ 25 мая 2014

Это можно сделать в 2 этапа:

  1. получить размер растрового изображения, используя inJustDecodeBounds = true.

  2. использовать BitmapRegionDecoderдекодировать только ту часть, которую вы хотите.

Недостаток?он работает только из API 10 (но это уже большинство ...).

1 голос
/ 30 июля 2010

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

Однако, если вы не хотите делатьчто вы можете быть вынуждены изучить кодировку самого jpeg.

Что вы можете сделать, это скопировать заголовок из файла в новый файл, а затем извлечь только те пиксели, которые выхочу, чтобы создать новый файл.Затем перезагрузка нового файла позволит вам иметь только подмножество изображения, с которым вы хотите работать, и все стандартные функции Java и классы будут в равной степени доступны для использования.

Я знаю, что это не так.Это не обязательно элегантное или простое решение, однако оно гарантирует, что вы сможете использовать оригинальную Java-функциональность, которую вы ожидаете использовать.

0 голосов
/ 22 июля 2010

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

Если растровое изображение уже настолько велико, что его нельзя загрузить как одно непрерывное изображение, зачем хранить его как одно изображение? Нарежьте его на плитки, затем загрузите центральные плитки / плитки и действуйте на них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...