Android ImageReader获取YUV数据

这个函数以一个 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝加点糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值