Как получить изменяемое растровое изображение с помощью ImageDecoder?

Я создаю растровое изображение следующим образом

       ImageDecoder.Source source = ImageDecoder.createSource(this.getContentResolver(), mSourceUri);
        try {
            bitmap = ImageDecoder.decodeBitmap(source));
        } catch (IOException e) {
            e.printStackTrace();
        }

Это возвращает неизменяемое растровое изображение. Я видел документацию google и есть методsetMutableRequired()но я не мог найти, как использовать этот метод. Он не работает с ImageDecoder, а также с исходным кодом

4 ответа

Решение

Немного красивее решение

imageBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888, true);

Обратитесь к этому ответу

Из API 28

ImageDecoder.Source source = ImageDecoder.createSource(getContentResolver(), imageUri);
            ImageDecoder.OnHeaderDecodedListener listener = new ImageDecoder.OnHeaderDecodedListener() {
                @Override
                public void onHeaderDecoded(@NonNull ImageDecoder decoder, @NonNull ImageDecoder.ImageInfo info, @NonNull ImageDecoder.Source source) {
                    decoder.setMutableRequired(true);
                }
            };
            bitmap = ImageDecoder.decodeBitmap(source, listener);

Обеспечьте ImageDecoder.OnHeaderDecodedListener как второй параметр для ImageDecoder.decodeBitmap().

Внутри слушателя вы получаете ImageDecoder, в который вы можете внести желаемые изменения.

ImageDecoder.decodeBitmap(imageSource, (decoder, info, source) -> {
    decoder.setMutableRequired(true);
});

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

BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSourceUri), null, options);

вдохновленный этим ответом.

Другие вопросы по тегам