如何使用 ImageDecoder 获取可变位图?

How to get mutable bitmap using ImageDecoder?

我正在创建如下位图

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

此 returns 不可变位图。我看到 google documentation 并且有一个方法 setMutableRequired() 但我找不到如何使用这个方法。它不适用于 ImageDecoder 以及 source

直到这个问题得到正确的答案。和我难度差不多的小伙伴可以使用BitmapFactory方法获取可变位图

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

灵感来自 this answer.

更漂亮的解决方案

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

参考

提供 ImageDecoder.OnHeaderDecodedListener 作为 ImageDecoder.decodeBitmap() 的第二个参数。

在侦听器中,您可以获得 ImageDecoder,您可以对其进行所需的更改。

ImageDecoder.decodeBitmap(imageSource, (decoder, info, source) -> {
    decoder.setMutableRequired(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);