使用MediaProjectionManager的屏幕截图,转换为宽度错误的位图



我正在制作一个使用MediaProjectionManager截取屏幕截图的应用程序,但我注意到在某些设备上它会在图像周围添加黑色边距。而不是正常打印屏幕

有人能帮我吗?这是我的代码:

fun startCapture(resultCode: Int, data: Intent) {
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data)
imageReader = ImageReader.newInstance(
displayMetrics.widthPixels, displayMetrics.heightPixels,
android.graphics.PixelFormat.RGBA_8888, 2
)
virtualDisplay = mediaProjection?.createVirtualDisplay(
VIRTUAL_NAME_DISPLAY,
displayMetrics.widthPixels, displayMetrics.heightPixels,
displayMetrics.densityDpi, VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY or VIRTUAL_DISPLAY_FLAG_PUBLIC,
imageReader?.surface, null, null
)
}
fun captureScreenshot(): Bitmap? {
val image: Image? = imageReader?.acquireLatestImage()
val bitmap: Bitmap? = image?.let { imageToBitmap(it) }
image?.close()
saveBitmap(bitmap)
return bitmap
}
private fun imageToBitmap(image: Image): Bitmap? {
val planes = image.planes
val buffer = planes[0].buffer
val pixelStride = planes[0].pixelStride
val rowStride = planes[0].rowStride
val rowPadding = rowStride - pixelStride * displayMetrics.widthPixels
val bitmap = Bitmap.createBitmap(
displayMetrics.widthPixels + rowPadding / pixelStride,
displayMetrics.heightPixels, Bitmap.Config.ARGB_8888
)
bitmap.copyPixelsFromBuffer(buffer)
return bitmap
}

我设法通过添加一个新的createBitmap来解决这个问题。

private fun imageToBitmap(image: Image): Bitmap? {
val planes = image.planes
val buffer = planes[0].buffer
val pixelStride = planes[0].pixelStride
val rowStride = planes[0].rowStride
val rowPadding = rowStride - pixelStride * displayMetrics.widthPixels
val bitmap = Bitmap.createBitmap(
displayMetrics.widthPixels + rowPadding / pixelStride,
displayMetrics.heightPixels, Bitmap.Config.ARGB_8888
)
bitmap.copyPixelsFromBuffer(buffer)
return Bitmap.createBitmap(bitmap, 0, 0,
displayMetrics.widthPixels,
displayMetrics.heightPixels)
}