gpt4 book ai didi

swift - Xcode 11.5 更新后通过 Buffer 获取数据

转载 作者:行者123 更新时间:2023-12-02 19:20:33 24 4
gpt4 key购买 nike

我拥有的:

引用Apple's Chroma Key Code ,它指出我们可以通过以下方式创建色度键滤镜立方体

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
}

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

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
}

然后我可以在任何图像上执行此函数并获得色度键控图像。

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

更新问题:

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)在上面的代码行上。

我尝试使用 this 解决此问题纠正 Swift 的新答案 UnsafeBufferPointer警告。然后警告得到纠正,我不再遇到运行时错误。

问题

现在,虽然警告没有出现并且我没有遇到运行时错误,但我仍然收到打印语句 Not filtered image 。我认为问题源于数据的处理或删除方式,不完全确定如何正确处理 UnsafeBufferPointers旁边Data .

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

最佳答案

我不确定此上下文中的 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
}

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

// 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)

一个警告:使用 Xcode 11.6 而不是 11.5 查看此内容

关于swift - Xcode 11.5 更新后通过 Buffer 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63124027/

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