这个函数以一个 Image 对象作为输入,并返回一个包含 YUV 数据的 ByteArray
fun image2YUV(image: Image): ByteArray? {
// 计算 Y 组件(亮度)的大小
val ySize = image.cropRect.width() * image.cropRect.height()
// 计算 UV 组件(色度)的大小
val uvSize = ySize / 4
// 从 Image 对象中获取 Y、U、V 组件的缓冲区
val yBuffer = image.planes[0].buffer
val uBuffer = image.planes[1].buffer
val vBuffer = image.planes[2].buffer
// 创建一个 ByteArray 来存储 YUV 数据
val yuvBytes = ByteArray(ySize + uvSize * 2)
// 从 Y 平面缓冲区中将 Y(亮度)数据复制到 yuvBytes 中
yBuffer.get(yuvBytes, 0, ySize)
// 确定 U 和 V 组件的步长(pixelStride)
val uStep = image.planes[1].pixelStride
val vStep = image.planes[2].pixelStride
// 从 U 平面缓冲区中将 U(Cb)数据复制到 yuvBytes 中
var uIndex = ySize // U 数据在 yuvBytes 中的起始位置
var uMax = if (uStep == 2) ySize / 2 else uvSize // 要复制的 U 元素数量
for (i in 0 until uMax step uStep) {
yuvBytes[uIndex] = uBuffer[i]
uIndex++
}
// 从 V 平面缓冲区中将 V(Cr)数据复制到 yuvBytes 中
var vIndex = ySize + uvSize // V 数据在 yuvBytes 中的起始位置
var vMax = if (vStep == 2) ySize / 2 else uvSize // 要复制的 V 元素数量
for (i in 0 until vMax step vStep) {
yuvBytes[vIndex] = vBuffer[i]
vIndex++
}
// 返回最终的 YUV ByteArray
return yuvBytes
}
- val uvSize = ySize / 4: 根据 4:2:0 采样计算 UV 组件(色度)的大小
- val yBuffer = image.planes[0].buffer
val uBuffer = image.planes[1].buffer
val vBuffer = image.planes[2].buffer:
从 Image 对象中获取 Y、U、V 平面的缓冲区 - yBuffer.get(yuvBytes, 0, ySize): 从 yBuffer 中复制 Y(亮度)数据到 yuvBytes
1546

被折叠的 条评论
为什么被折叠?



