Измените размер большого растрового файла к масштабированному выходному файлу на Android

У меня есть большой битовый массив (скажите 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, но это не прокладывает себе путь.

214
задан jww 2 September 2018 в 05:44
поделиться

2 ответа

Нет. Буду рад, если кто-то меня поправит, но я принял подход с загрузкой/размером, который вы пробовали, как компромисс.

Вот шаги для тех, кто просматривает:

  1. Вычислите максимально возможный inSampleSize, который все еще дает изображение больше, чем ваша цель.
  2. Загрузите изображение с помощью BitmapFactory.decodeFile(file, options), передав inSampleSize в качестве опции.
  3. Измените размер до нужных размеров с помощью Bitmap.createScaledBitmap().
144
ответ дан 23 November 2019 в 04:26
поделиться

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

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);
6
ответ дан 23 November 2019 в 04:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: