OpenCV Utils.matToBitmap дает сбой подтверждения AndroidBitmap_lockPixels (env, bitmap, & пиксели)> = 0, если растровое изображение создается с помощью ImageDecoder.createSource - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть эта функция расширения для создания растрового изображения из 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 все работает нормально.

Чего мне не хватает?

1 Ответ

0 голосов
/ 25 сентября 2019

Глядя на ImageDecoder официальный документ, вы можете прочитать:

По умолчанию растровое изображение, созданное ImageDecoder (включая изображение внутри Drawable), будет неизменным(т.е. 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
    }
  }
}

Проблема исчезла!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...