swift 将视频YUV数组转RGB数据

// YUV 到 RGB 的转换器
class YUVToRGBConverter {
    func convertYUVToRGB(yBuffer: UnsafeMutableRawPointer, uBuffer: UnsafeMutableRawPointer, vBuffer: UnsafeMutableRawPointer, width: Int, height: Int, yStride: Int, uStride: Int, vStride: Int, rgbContext: CGContext) {
        // 这里是一个简单的 YUV 到 RGB 转换示例
        for y in 0..<height {
            for x in 0..<width {
                let yOffset = y * yStride + x
                let uOffset = (y / 2) * uStride + (x / 2)
                let vOffset = (y / 2) * vStride + (x / 2)
                
                let yValue = Float(yBuffer.load(fromByteOffset: yOffset, as: UInt8.self))
                let uValue = Float(uBuffer.load(fromByteOffset: uOffset, as: UInt8.self)) - 128
                let vValue = Float(vBuffer.load(fromByteOffset: vOffset, as: UInt8.self)) - 128
                
                // YUV 到 RGB 转换公式
                var rValue = yValue + 1.402 * vValue
                var gValue = yValue - 0.344 * uValue - 0.714 * vValue
                var bValue = yValue + 1.772 * uValue
                
                // 确保 RGB 值在合法范围内
                rValue = min(max(rValue, 0), 255)
                gValue = min(max(gValue, 0), 255)
                bValue = min(max(bValue, 0), 255)
                
                // 在 RGB 上下文中绘制像素
                rgbContext.setFillColor(red: CGFloat(rValue) / 255.0, green: CGFloat(gValue) / 255.0, blue: CGFloat(bValue) / 255.0, alpha: 1.0)
                rgbContext.fill(CGRect(x: x, y: y, width: 1, height: 1))
            }
        }
    }
}

拓展:通过YUVData识别视频帧里边的二维码

    func detectQRCode(fromYUVData yBuffer: UnsafeMutableRawPointer, uBuffer: UnsafeMutableRawPointer, vBuffer: UnsafeMutableRawPointer, width: Int, height: Int, yStride: Int, uStride: Int, vStride: Int) -> String? {
        // 创建一个 CGContext 来绘制 RGB 图像
        guard let rgbContext = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: width * 4, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue) else {
            return nil
        }
        
        // 将 YUV 数据转换为 RGB 数据
        let yuvToRGBConverter = YUVToRGBConverter()
        yuvToRGBConverter.convertYUVToRGB(yBuffer: yBuffer, uBuffer: uBuffer, vBuffer: vBuffer, width: width, height: height, yStride: yStride, uStride: uStride, vStride: vStride, rgbContext: rgbContext)
        
        // 从 CGContext 创建 CIImage
        if let cgImage = rgbContext.makeImage() {
            let ciImage = CIImage(cgImage: cgImage)

            // 创建 CIDetector 对象
            let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)
            
            // 检测二维码
            let features = detector?.features(in: ciImage)
            
            // 提取二维码中的信息
            for feature in features ?? [] {
                if let qrCodeFeature = feature as? CIQRCodeFeature {
                    return qrCodeFeature.messageString
                }
            }
            
            return nil
        }
        
        return nil
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值