3

我正在创建位图如下

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

这将返回不可变位图。我看到了谷歌文档并且有一种方法setMutableRequired(),但我找不到如何使用这种方法。它不适用于 ImageDecoder 以及源

4

4 回答 4

2

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

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

ImageDecoder.decodeBitmap(imageSource, (decoder, info, source) -> {
    decoder.setMutableRequired(true);
});
于 2020-05-01T07:14:15.943 回答
2

从 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);
于 2020-07-21T20:16:06.127 回答
1

更漂亮的解决方案

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

参考这个答案

于 2020-01-17T11:02:30.170 回答
0

直到一个正确的答案到达这个问题。任何和我有类似困难的人都可以使用 BitmapFactory 方法来获取可变位图

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

灵感来自这个答案

于 2020-01-17T10:36:19.567 回答