Android CameraX问题:无法将ImageProxy转换为Bitmap
问题原因
错误提示里的256对应ImageFormat.JPEG格式,而ImageProxy.toBitmap()方法仅支持ImageFormat.YUV_420_888和PixelFormat.RGBA_8888两种格式。你的ImageCapture配置默认输出了JPEG格式的图像,直接调用toBitmap()就会触发这个格式不兼容的异常。
解决方案
有两种可行的解决思路:
思路1:修改ImageCapture配置,输出支持的格式
创建ImageCapture实例时,指定输出格式为YUV_420_888(兼容性更好)或RGBA_8888,这样后续可以直接调用toBitmap():
val imageCapture = ImageCapture.Builder() .setOutputImageFormat(ImageFormat.YUV_420_888) // 可添加其他配置(如分辨率、捕获模式) .build()
思路2:手动解析JPEG格式的ImageProxy为Bitmap
如果需要保留JPEG输出格式,可以提取图像的字节流,用BitmapFactory解码生成Bitmap:
override fun onCaptureSuccess(image: ImageProxy) { super.onCaptureSuccess(image) val resultBitmap: Bitmap? = if (image.format == ImageFormat.JPEG) { // 提取JPEG字节流 val plane = image.planes[0] val buffer = plane.buffer val byteArray = ByteArray(buffer.remaining()) buffer.get(byteArray) // 解码为Bitmap BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) } else { // 支持的格式直接转Bitmap image.toBitmap() } // 切换到主线程更新Compose状态(回调在子线程执行) resultBitmap?.let { bitmap -> CoroutineScope(Dispatchers.Main).launch { image = bitmap } } image.close() }
注意:由于takePicture的回调是在子线程执行的,更新Compose的状态变量必须切换到主线程,否则会触发线程异常。
内容的提问来源于stack exchange,提问作者woxiangqiu
相关产品推荐
相关产品推荐

