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。