gpt4 book ai didi

ios - 缩放 CVImageBuffer 中的图像

转载 作者:行者123 更新时间:2023-11-29 05:33:16 25 4
gpt4 key购买 nike

我有一个任务 - 缩小我从相机获得的图像。我需要它来对较小版本的图像执行繁重的操作,这将帮助我节省一些处理能力。

我决定使用 AcceleratevImage_Buffer。这是我的代码,只有很少的注释,只是为了清楚地理解其中的内容:

        guard let imgBuffer = CMSampleBufferGetImageBuffer(buffer) else {
return
}


CVPixelBufferLockBaseAddress(imgBuffer, CVPixelBufferLockFlags(rawValue: 0))

// create vImage_Buffer out of CVImageBuffer
var inBuff: vImage_Buffer = vImage_Buffer()
inBuff.width = UInt(CVPixelBufferGetWidth(imgBuffer))
inBuff.height = UInt(CVPixelBufferGetHeight(imgBuffer))
inBuff.rowBytes = CVPixelBufferGetBytesPerRow(imgBuffer)
inBuff.data = CVPixelBufferGetBaseAddress(imgBuffer)

// bring down the size at half
let new_width: UInt = inBuff.width/2
let new_height: UInt = inBuff.height/2

// create output buffer where scaled image is supposed to be
var outBuff: vImage_Buffer = vImage_Buffer()
outBuff.data = UnsafeMutableRawPointer.allocate(byteCount: Int(new_width * new_height * 4), alignment: MemoryLayout<UInt>.size)
outBuff.width = new_width
outBuff.height = new_height
outBuff.rowBytes = Int(new_width * 4)

// perform scale
let err = vImageScale_ARGB8888(&inBuff, &outBuff, nil, 0)
if err != kvImageNoError {
print("Wrong!")
}

// I guess I need to unlock buffer at this point, right?
CVPixelBufferUnlockBaseAddress(imgBuffer, CVPixelBufferLockFlags(rawValue: 0))

// create CVImageBuffer
let options = [kCVPixelBufferCGImageCompatibilityKey: true,
kCVPixelBufferCGBitmapContextCompatibilityKey: true,
kCVPixelBufferWidthKey: new_width,
kCVPixelBufferHeightKey: new_height] as CFDictionary

var newPixelBuffer: CVImageBuffer?
let status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
Int(new_width), Int(new_height),
kCVPixelFormatType_32BGRA, &outBuff, Int(new_width * 4),
nil, nil, options, &newPixelBuffer)

if status == kCVReturnError {
print("Wrong again!")
}

// create CIImage from CVImageBuffer and UIImage from CIImage just to see how scale went
let ciImg = CIImage(cvImageBuffer: newPixelBuffer!)
let img = UIImage(ciImage: ciImg)
delegate?.testSmallImage(img)

似乎所有操作都执行得没有任何错误,我想检查缩放效果如何,因此我尝试从缩放缓冲区中创建新的 UIImage 。但是,当我尝试使用 UIImageView 显示图像时,出现 EXC_BAD_ACCESS 错误。当我尝试保存全新的 UIImage 时,一切都没有错误,但 Documents 目录中没有出现任何文件。你能指出我到底做错了什么吗?谢谢!

最佳答案

这是 Swift 上调整 CMSampleBuffer 大小的代码片段:

    private func scale(_ sampleBuffer: CMSampleBuffer) -> CVImageBuffer?
{
guard let imgBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return nil
}

CVPixelBufferLockBaseAddress(imgBuffer, CVPixelBufferLockFlags(rawValue: 0))

// create vImage_Buffer out of CVImageBuffer
var inBuff: vImage_Buffer = vImage_Buffer()
inBuff.width = UInt(CVPixelBufferGetWidth(imgBuffer))
inBuff.height = UInt(CVPixelBufferGetHeight(imgBuffer))
inBuff.rowBytes = CVPixelBufferGetBytesPerRow(imgBuffer)
inBuff.data = CVPixelBufferGetBaseAddress(imgBuffer)

// perform scale
var err = vImageScale_ARGB8888(&inBuff, &scaleBuffer, nil, 0)
if err != kvImageNoError {
print("Can't scale a buffer")
return nil
}
CVPixelBufferUnlockBaseAddress(imgBuffer, CVPixelBufferLockFlags(rawValue: 0))

var newBuffer: CVPixelBuffer?
let attributes : [NSObject:AnyObject] = [
kCVPixelBufferCGImageCompatibilityKey : true as AnyObject,
kCVPixelBufferCGBitmapContextCompatibilityKey : true as AnyObject
]

let status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
Int(scaleBuffer.width), Int(scaleBuffer.height),
kCVPixelFormatType_32BGRA, scaleBuffer.data,
Int(scaleBuffer.width) * 4,
nil, nil,
attributes as CFDictionary?, &newBuffer)

guard status == kCVReturnSuccess, let b = newBuffer else {
print("Can't create new CVPixelBuffer")
return nil
}

return b
}

这里是 scaleBuffer 的定义,它充当缩放操作中的目的地。我不需要为每个比例创建它,所以我只创建一次:

        scaleBuffer.data = UnsafeMutableRawPointer.allocate(byteCount: Int(new_width * new_height * 4), alignment: MemoryLayout<UInt>.size)
scaleBuffer.width = vImagePixelCount(new_width)
scaleBuffer.height = vImagePixelCount(new_height)
scaleBuffer.rowBytes = Int(new_width * 4)

关于ios - 缩放 CVImageBuffer 中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57327226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com