У меня есть большой битовый массив (скажите 3888x2592) в файле. Теперь, я хочу изменить размер того битового массива к 800x533 и сохранить его в другой файл. Я обычно масштабировал бы битовый массив путем вызова Bitmap.createBitmap
метод, но этому нужно исходное растровое изображение как первый аргумент, который я не могу обеспечить, потому что загрузка исходного изображения в Растровый объект, конечно, превысила бы память (см. здесь, например).
Я также не могу считать битовый массив с, например, BitmapFactory.decodeFile(file, options)
, обеспечение a BitmapFactory.Options.inSampleSize
, потому что я хочу изменить размер его к точной ширине и высоте. Используя inSampleSize
изменил бы размер битового массива к 972x648 (если я использую inSampleSize=4
) или к 778x518 (если я использую inSampleSize=5
, который не является даже питанием 2).
Я также хотел бы постараться не читать изображение с помощью inSampleSize с, например, 972x648 в первом шаге и затем изменяя размер его к точно 800x533 на втором шаге, потому что качество будет плохо по сравнению с прямым изменением размеров исходного изображения.
Подвести итог моего вопроса: существует ли способ считать большой файл изображения с 10MP или больше и сохранить его к новому файлу изображения, измененному к определенной новой ширине и высоте, не получая исключение OutOfMemory?
Я также попробовал BitmapFactory.decodeFile(file, options)
и установка Options.outHeight и Options.outWidth оценивает вручную 800 и 533, но это не прокладывает себе путь.
Нет. Буду рад, если кто-то меня поправит, но я принял подход с загрузкой/размером, который вы пробовали, как компромисс.
Вот шаги для тех, кто просматривает:
inSampleSize
, который все еще дает изображение больше, чем ваша цель. BitmapFactory.decodeFile(file, options)
, передав inSampleSize в качестве опции. Bitmap.createScaledBitmap()
. Когда у меня есть большие растровые изображения и я хочу их декодировать с измененным размером, я использую следующую
BitmapFactory.Options options = new BitmapFactory.Options();
InputStream is = null;
is = new FileInputStream(path_to_file);
BitmapFactory.decodeStream(is,null,options);
is.close();
is = new FileInputStream(path_to_file);
// here w and h are the desired width and height
options.inSampleSize = Math.max(options.outWidth/w, options.outHeight/h);
// bitmap is the resized bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is,null,options);