通过 Buffer Post Xcode 11.5 更新的数据

imp*_*7vx 2 unsafe-pointers chromakey swift

我拥有的:

引用Apple 的 Chroma Key Code,它指出我们可以通过创建一个 Chroma Key Filter Cube

func chromaKeyFilter(fromHue: CGFloat, toHue: CGFloat) -> CIFilter?
{
    // 1
    let size = 64
    var cubeRGB = [Float]()
        
    // 2
    for z in 0 ..< size {
        let blue = CGFloat(z) / CGFloat(size-1)
        for y in 0 ..< size {
            let green = CGFloat(y) / CGFloat(size-1)
            for x in 0 ..< size {
                let red = CGFloat(x) / CGFloat(size-1)
                    
                // 3
                let hue = getHue(red: red, green: green, blue: blue)
                let alpha: CGFloat = (hue >= fromHue && hue <= toHue) ? 0: 1
                    
                // 4
                cubeRGB.append(Float(red * alpha))
                cubeRGB.append(Float(green * alpha))
                cubeRGB.append(Float(blue * alpha))
                cubeRGB.append(Float(alpha))
            }
        }
    }

    let data = Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))

    // 5
    let colorCubeFilter = CIFilter(name: "CIColorCube", withInputParameters: ["inputCubeDimension": size, "inputCubeData": data])
    return colorCubeFilter
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个函数,能够将任何图像插入到这个过滤器中并返回过滤后的图像。

public func filteredImage(ciimage: CIImage) -> CIImage? {
    let filter = chromaKeyFilter(fromHue: 110/360, toHue: 130/360)! //green screen effect colors
    filter.setValue(ciimage, forKey: kCIInputImageKey)
    return RealtimeDepthMaskViewController.filter.outputImage
}
Run Code Online (Sandbox Code Playgroud)

然后我可以在任何图像上执行这个函数并获得一个色度键的图像。

if let maskedImage = filteredImage(ciimage: ciimage) {
    //Do something
}
else {
    print("Not filtered image")
}
Run Code Online (Sandbox Code Playgroud)

更新问题:

let data = Data(buffer: UnsafeBufferPointer(start: &cubeRGB, count: cubeRGB.count))

但是,一旦我将 Xcode 更新到 v11.6,我就会在上面的代码行中收到警告Initialization of 'UnsafeBufferPointer<Float>' results in a dangling buffer pointer以及运行时错误Thread 1: EXC_BAD_ACCESS (code=1, address=0x13c600020)

我尝试用这个答案解决这个问题,以纠正 Swift 的新UnsafeBufferPointer警告。然后更正警告,我不再有运行时错误。

问题

现在,虽然没有出现警告并且我没有遇到运行时错误,但我仍然得到了打印语句Not filtered image。我认为,这个问题从方式茎中的数据被处理或删除,完全不知道如何正确处理UnsafeBufferPointers一起Data

正确获取Data色度键的合适方法是什么?

len*_*til 5

我不确定RealtimeDepthMaskViewController在这种情况下是什么,所以只返回过滤器输出。如果这意味着保持原样,我们深表歉意。还添加了一个可能返回 nil 的保护语句 - 它与您的函数的可选返回类型相匹配。

public func filteredImage(ciImage: CIImage) -> CIImage? {
    guard let filter = chromaKeyFilter(fromHue: 110/360, toHue: 130/360) else { return nil }
    filter.setValue(ciImage, forKey: "inputImage")
    return filter.outputImage // instead of RealtimeDepthMaskViewController.filter.outputImage
}
Run Code Online (Sandbox Code Playgroud)

对于悬空指针编译器警告,我找到了几种方法:

// approach #1
var data = Data()
cubeRGB.withUnsafeBufferPointer { ptr in
    data = Data(buffer: ptr)
}

// approach #2
let byteCount = MemoryLayout<Float>.size * cubeRGB.count
let data = Data(bytes: &cubeRGB, count: byteCount)
Run Code Online (Sandbox Code Playgroud)

一个警告:用 Xcode 11.6 而不是 11.5 看这个