我想处理预览中显示的图像并显示处理后的版本。
我尝试使用分析器中的 imageProxy 对其进行修改,但这似乎没有做任何事情。
我知道较旧的相机 API 能够做到这一点,但 CameraX 似乎没有 API。
我想处理预览中显示的图像并显示处理后的版本。
我尝试使用分析器中的 imageProxy 对其进行修改,但这似乎没有做任何事情。
我知道较旧的相机 API 能够做到这一点,但 CameraX 似乎没有 API。
不,cameraX 不支持此流程。实际上,这个用例从未被任何 Android 相机 API 支持。您需要做的是创建自己的渲染器(最好是 OpenGL),隐藏原生预览表面,并将修改后的帧发送到您的渲染器。
希望这会有所帮助:
val mediaImage = imageProxy.image ?: return
var bitmap = ImageUtils.convertYuv420888ImageToBitmap(mediaImage)
val rotationDegrees = imageProxy.imageInfo.rotationDegrees
val matrix = Matrix()
matrix.postRotate(rotationDegrees.toFloat())
bitmap =
Bitmap.createBitmap(bitmap, 0, 0, mediaImage.width, mediaImage.height, matrix, true)
val cropHeight = if (bitmap.width < previewView.width) {
// if preview area larger than analysing image
val koeff = bitmap.width.toFloat() / previewView.width.toFloat()
previewView.height.toFloat() * koeff
} else {
// if preview area smaller than analysing image
val prc = 100 - (previewView.width.toFloat() / (bitmap.width.toFloat() / 100f))
previewView.height + ((previewView.height.toFloat() / 100f) * prc)
}
val cropTop = (bitmap.height / 2) - ((cropHeight) / 2)
if (cropTop > 0) {
Bitmap.createBitmap(bitmap, 0, cropTop.toInt(), bitmap.width, cropHeight.toInt())
.also { process(it, imageProxy) }
} else {
imageProxy.image?.let { process(it, imageProxy) }
}