调整CVPixelBuffer的大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调整CVPixelBuffer的大小相关的知识,希望对你有一定的参考价值。

我正在尝试将CVPixelBuffer的大小调整为128x128。我正在使用750x750的一个。我目前正在使用CVPixelBuffer创建一个新的CGImage,我调整大小然后转换回CVPixelBuffer。这是我的代码:

func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? {
    if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) {
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
        let context = CIContext()
        let imageRect = CGRect(x: 0, y: 0, width: 128, height: 128)

        if let image = context.createCGImage(ciImage, from: imageRect) {
            let t = CIImage(cgImage: image)
            let new = t.applying(transformation)
            context.render(new, to: pixelBuffer)

            return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right)
        }

    }

    return nil
}

我也试过缩放CIImage然后转换它:

let t = CIImage(cgImage: image)
let transformation = CGAffineTransform(scaleX: 1, y: 2)
let new = t.applying(transformation)
context.render(new, to: pixelBuffer)

但这也不起作用。

任何帮助表示赞赏。谢谢!

答案

试试这个

func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? {
    if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) {
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
        let resizedCIImage = ciImage.applying(CGAffineTransform(scaleX: 128.0 / 750.0, y: 128.0 / 750.0))

        let context = CIContext()
        if let image = context.createCGImage(resizedCIImage, from: resizedCIImage.extent) {
            return UIImage(cgImage: image)
        } 
    }
    return nil
}

这里我假设像素缓冲区是正方形,大小等于750x750,您可以将其更改为适用于所有宽高比和大小

另一答案

不需要像素缓冲区渲染等。只需将原始的CIImage和作物转换为大小。如果源和目标维度不成比例,则必须进行裁剪。

func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? {
    if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) {
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer)

        let srcWidth = CGFloat(ciImage.extent.width)
        let srcHeight = CGFloat(ciImage.extent.height)

        let dstWidth: CGFloat = 128
        let dstHeight: CGFloat = 128

        let scaleX = dstWidth / srcWidth
        let scaleY = dstHeight / srcHeight
        let scale = min(scaleX, scaleY)

        let transform = CGAffineTransform.init(scaleX: scale, y: scale)
        let output = ciImage.transformed(by: transform).cropped(to: CGRect(x: 0, y: 0, width: dstWidth, height: dstHeight))

        return UIImage(ciImage: output)
    }

    return nil
}

以上是关于调整CVPixelBuffer的大小的主要内容,如果未能解决你的问题,请参考以下文章

android - 调整片段大小

调整片段中 TextView 的文本大小

在 Kotlin 中调整对话框片段的大小

键盘打开时,带有片段的活动不会调整大小

css CSS对齐和大小调整片段

出现键盘后调整活动大小