如何使用 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);
我正在创建如下位图
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);