Я декодирую растровые изображения с SD-карты с помощью BitmapFactory.decodeFile
. Иногда растровые изображения больше, чем того требует приложение или что куча позволяет, поэтому я использую BitmapFactory.Options.inSampleSize
для запроса подвыборки (меньшего) растрового изображения.
Проблема в том, что платформа не обеспечивает точное значение inSampleSize, и иногда я получаю растровое изображение слишком маленькое или все еще слишком большое для доступной памяти.
Из http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize:
Примечание: декодер попытается выполнить этот запрос, но полученный битмап могут иметь разные размеры, которые именно то, что было запрошено. Кроме того, полномочия 2 часто быстрее/проще для декодера честь.
Как мне декодировать растровые изображения с SD-карты, чтобы получить растровое изображение точного размера, которое мне нужно, потребляя как можно меньше памяти для его декодирования?
Edit:
Текущий исходный код:
BitmapFactory.Options bounds = new BitmapFactory.Options();
this.bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bounds);
if (bounds.outWidth == -1) { // TODO: Error }
int width = bounds.outWidth;
int height = bounds.outHeight;
boolean withinBounds = width <= maxWidth && height <= maxHeight;
if (!withinBounds) {
int newWidth = calculateNewWidth(int width, int height);
float sampleSizeF = (float) width / (float) newWidth;
int sampleSize = Math.round(sampleSizeF);
BitmapFactory.Options resample = new BitmapFactory.Options();
resample.inSampleSize = sampleSize;
bitmap = BitmapFactory.decodeFile(filePath, resample);
}