【发布时间】:2023-04-03 03:03:01
【问题描述】:
我有什么:
引用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 的适当方法是什么?
【问题讨论】:
标签: swift unsafe-pointers chromakey