Android Jetpack组合不可变图像位图以传递到画布

Android Jetpack组合不可变图像位图以传递到画布,android,canvas,android-bitmap,android-jetpack-compose,Android,Canvas,Android Bitmap,Android Jetpack Compose,将不可变图像加载到画布时会崩溃 java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor 在经典Android画布和Compose画布中 使用下面的代码片段是Jetpack Compose中崩溃的原因 val deferredResource: DeferredResource<ImageBitmap> = loadImageResource(id = R.drawable.

将不可变图像加载到画布时会崩溃

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
在经典Android画布和Compose画布中

使用下面的代码片段是Jetpack Compose中崩溃的原因

val deferredResource: DeferredResource<ImageBitmap> =
    loadImageResource(id = R.drawable.landscape2)

deferredResource.resource.resource?.let { imageBitmap ->
    val paint = Paint().apply {
        style = PaintingStyle.Stroke
        strokeWidth = 1f
        color = Color(0xffFFEE58)

    }
    Canvas(image = imageBitmap).drawRect(0f, 0f, 100f, 100f, paint)
}
我可以使用

        val bitmap = imageBitmap.asAndroidBitmap().copy(Bitmap.Config.ARGB_8888, true)
 val newImageBitmap = bitmap.asImageBitmap()
发现还可以使用将
Bitmap
转换回
ImageBitmap

        val bitmap = imageBitmap.asAndroidBitmap().copy(Bitmap.Config.ARGB_8888, true)
 val newImageBitmap = bitmap.asImageBitmap()
结果,我在用下面的代码片段绘制位图之后

  val canvas = Canvas(newImageBitmap)

    canvas.drawRect(0f, 0f, 200f, 200f, paint = paint)
    canvas.drawCircle(
        Offset(
            newImageBitmap.width / 2 - 75f,
            newImageBitmap.height / 2 + 75f
        ), 150.0f, paint
    )

    Image(bitmap = newImageBitmap)
有没有一种不在位图和ImageBitmap之间来回转换的情况下使用画布在ImageBitmap上绘制的方法不那么复杂?

loadImageResource()
正在使用
AndroidImageBitmap
实现
Bitmap.decodeResource(resources,drawableId)
请求调用它而不使用选项

这可能是写作的局限性。您可能需要编写自己的
loadingImageResource()
,它将使用可变
位图调用自己的
ImageBitmap
实现

funImageFromResource(res:Resources,resd:Int):图像位图{
返回MutableAndroidImageBitmap(BitmapFactory.decodeResource(res,resId,BitmapFactory.Options().apply{inMutable=true}))
}
类可变AndroidImageBitmap(内部val位图:位图):ImageBitmap

注意,DouWaWin将失败,因为转换<代码> ASANDROIDBITMAP()/代码>检查<代码> IMAGE BITMAP 当将<代码> IMAGE位图绘制到基础>代码>画布< /代码> .< 我想你应该坚持你在问题中所说的步骤

asImageBitmap()
不会将
ImageBitmap
转换为
Bitmap
它只返回包装的内部属性。将
Bitmap
转换为
ImageBitmap
会读取像素数据的副本并创建其副本

suspend fun ImageBitmap.mutate(context: CoroutineContext = EmptyCoroutineContext, config: Bitmap.Config) = withContext(context) {
    val workingBitmap = asAndroidBitmap() //this is just access to `bitmap` property
    val mutableBitmap = workingBitmap.copy(config, true)
    workingBitmap.recycle()
    mutableBitmap.asImageBitmap()
}


问题追踪器上打开的bug

您是否使用正确的
画布
?你可能应该使用<代码> .ANDROXX.Fix.Fask.Cuavas,具有<代码> OnDebug 参数。我不使用<代码> ANDROIDX。此处的目的是将图像作为参数发送,修改该位图并将其与该位图顶部的图形一起返回<代码> DeWiMAGE <代码>函数>代码> ANDROIDX。