Как создать объект Bitmap с BitmapFactory.Options имея обьект URI?

156
19 января 2020, 12:20

У меня есть объект URI который содержит в себе адрес загружаемого изображения. Мне надо получить изображение и изменить его размер.

Есть объект полученный как входной параметр

  private final Uri mUri;
  public LoadEditSaveImageTask(Uri uri) {
        this.mUri = uri;
    }

Создаю новый объект c options:

  BitmapFactory.Options optionsBitmap = new BitmapFactory.Options();
  optionsBitmap.inJustDecodeBounds = true;

Дальше открываю поток:

FileInputStream fis = (FileInputStream) 
mContext.getContentResolver().openInputStream(mUri);

Получаю из потока размеры картинки, при этом не загружаю в память:

BitmapFactory.decodeStream(fis, null, optionsBitmap); 

Далее определяю новый требуемый размер картинки с помощью метода inSampleSize:

optionsBitmap.inSampleSize = calculateInSampleSize(optionsBitmap, NEED_WIDTH_IMAGE, NEED_HEIGHT_IMAGE)

Пытаюсь создать Bitmap с новым размером. При этом из потока я благополучно получил размер картинки.

FileInputStream fis2 = (FileInputStream) 
mContext.getContentResolver().openInputStream(mUri);
Bitmap scaledImage = BitmapFactory.decodeStream(fis2,null,optionsBitmap);

Выдает ошибку scaledImage равно null. При этом если загружать без optionsBitmap, то картинка загружается. Не могу понять где ошибка и почему не могу получить изображение.Подскажите пожалуйста.

Полный код метода:

private Bitmap checkANdScale() {
        Bitmap scaledImage = null;
        BitmapFactory.Options optionsBitmap = new BitmapFactory.Options();
        optionsBitmap.inJustDecodeBounds = true;
        try {
            FileInputStream fis = (FileInputStream) mContext.getContentResolver().openInputStream(mUri);
            BitmapFactory.decodeStream(fis, null, optionsBitmap);
            if (fis != null) {
                fis.close();
            }
            optionsBitmap.inSampleSize = calculateInSampleSize(optionsBitmap, NEED_WIDTH_IMAGE, NEED_HEIGHT_IMAGE);
            FileInputStream fis2 = (FileInputStream) mContext.getContentResolver().openInputStream(mUri);
            scaledImage = BitmapFactory.decodeStream(fis2,null,optionsBitmap);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return scaledImage;
    }
Answer 1

Все, разобрался. В коде я использовал options из старого потока.Создал новый options и все заработало.

BitmapFactory.Options optionsCreateBitmap = new BitmapFactory.Options();
FileInputStream fis2 = (FileInputStream) mContext.getContentResolver().openInputStream(mUri);
            optionsCreateBitmap.inSampleSize = 2;
            scaledImage = BitmapFactory.decodeStream(fis2, null, optionsCreateBitmap);
READ ALSO
Бесплатный API штрафов гибдд

Бесплатный API штрафов гибдд

Откуда берут информацию о штрафах всякие левые сервисы?

146
Почему падают тесты с Selenium 3.0? Ошибка “org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session”

Почему падают тесты с Selenium 3.0? Ошибка “org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session”

Тест запускает браузер и падаетКак это можно исправить? Получаю такой лог:

176
JTextField действие при клике

JTextField действие при клике

У меня есть массив JTextField[][], после ввода символа в JTextField[i][j], остальные поля блокируются(jTextField_entersetEditable(false);)

160