首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV Utils.matToBitmap:如果位图是用ImageDecoder.createSource创建的,则断言失败的AndroidBitmap_lockPixels(env、位图和像素) >= 0

OpenCV Utils.matToBitmap:如果位图是用ImageDecoder.createSource创建的,则断言失败的AndroidBitmap_lockPixels(env、位图和像素) >= 0
EN

Stack Overflow用户
提问于 2019-09-25 16:05:16
回答 1查看 582关注 0票数 0

我有这个扩展函数,以便从Uri创建一个位图

代码语言:javascript
运行
复制
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时,我得到了这个异常:

代码语言:javascript
运行
复制
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,一切都很好。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 16:07:15

查看ImageDecoder官方文档,您可以阅读:

默认情况下,由

创建的位图(包括可绘制的位图)将是不可变的(即Bitmap#isMutable返回false),并且通常有Config Bitmap.Config#HARDWARE。尽管可以用setMutableRequired更改这些属性(True)

因此,通过添加

setMutableRequired(true)

以这种方式:

代码语言:javascript
运行
复制
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
    }
  }
}

问题已经解决了!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58102486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档