【发布时间】:2020-11-05 17:26:32
【问题描述】:
我正在使用 ImageReader 从服务中截取 Android 设备的屏幕截图。 但是 imageReader.planes 返回 AndroidMediaUtils: RGBA override BLOB 格式缓冲区应该有 height == width。
我的代码:
fun takeScreen() : ByteArray? {
var result = byteArrayOf()
val display = (getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
mediaProjection.registerCallback(object : MediaProjection.Callback() {}, null)
val imageReader = ImageReader.newInstance(
display.width, display.height,
ImageFormat.JPEG, 2
)
val metrics = DisplayMetrics()
display.getMetrics(metrics)
val flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY or DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC
mediaProjection.createVirtualDisplay( "vd", display.width, display.height, metrics.densityDpi, flags, imageReader.surface, null, null)
imageReader.setOnImageAvailableListener({
val image = it.acquireLatestImage()
if (image != null) {
val planes: Array<Image.Plane> = image.planes
val buffer = planes[0].buffer
val pixelStride: Int = planes[0].pixelStride
val rowStride = planes[0].rowStride
val rowPadding: Int = rowStride - pixelStride * it.width
val bitmap = Bitmap.createBitmap(
it.width + rowPadding / pixelStride,
it.height, Bitmap.Config.ARGB_8888
)
bitmap.copyPixelsFromBuffer(buffer)
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream)
result = stream.toByteArray()
}
}, null)
return result
}
怎么了?
【问题讨论】:
标签: android