我有这个扩展函数,以便从Uri创建一个位图
fun Uri.getBitmap(resolver: ContentResolver): Bitmap {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
@Suppress("DEPRECATION")
return MediaStore.Images.Media.getBitmap(resolver, this)
} else {
val source = ImageDecoder.createSource(resolver, this)
return ImageDecoder.decodeBitmap(source)
}
}
在Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
中,所以当我使用ImageDecoder.createSource
时,我得到了这个异常:
CvException [org.opencv.core.CvException: OpenCV(4.1.1) /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:38: error: (-215:Assertion failed) AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0
在Build.VERSION.SDK_INT < Build.VERSION_CODES.P
上,所以使用MediaStore.Images.Media.getBitmap
,一切都很好。
我遗漏了什么?
发布于 2019-09-25 16:07:15
查看ImageDecoder
官方文档,您可以阅读:
默认情况下,由
创建的位图(包括可绘制的位图)将是不可变的(即Bitmap#isMutable返回false),并且通常有Config Bitmap.Config#HARDWARE。尽管可以用setMutableRequired更改这些属性(True)
因此,通过添加
setMutableRequired(true)
以这种方式:
fun Uri.getBitmap(resolver: ContentResolver): Bitmap {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
@Suppress("DEPRECATION")
return MediaStore.Images.Media.getBitmap(resolver, this)
} else {
// https://developer.android.com/reference/android/graphics/ImageDecoder
// CvException [org.opencv.core.CvException: OpenCV(4.1.1) /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:38: error: (-215:Assertion failed) AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0
/*
By default, a Bitmap created by ImageDecoder (including one that is inside a Drawable)
will be immutable (i.e. Bitmap#isMutable returns false), and it will typically
have Config Bitmap.Config#HARDWARE. Although these properties can be changed
with setMutableRequired(true)
*/
val source = ImageDecoder.createSource(resolver, this)
return ImageDecoder.decodeBitmap(source) { decoder, _, _ ->
decoder.isMutableRequired = true
}
}
}
问题已经解决了!
https://stackoverflow.com/questions/58102486
复制相似问题