我想让CIColorCube过滤器工作.但是,Apple文档仅提供了一个解释不佳的参考示例:
// Allocate memory const unsigned int size = 64; float *cubedata = (float *)malloc (size * size * size * sizeof (float) * 4); float rgb[3],hsv[3],*c = cubedata; // Populate cube with a simple gradient going from 0 to 1 for (int z = 0; z < size; z++){ rgb[2] = ((double)z)/(size-1); // Blue value for (int y = 0; y < size; y++){ rgb[1] = ((double)y)/(size-1); // Green value for (int x = 0; x < size; x ++){ rgb[0] = ((double)x)/(size-1); // Red value // Convert RGB to HSV // You can find publicly available rgbToHSV functions on the Internet rgbToHSV(rgb,hsv); // Use the hue value to determine which to make transparent // The minimum and maximum hue angle depends on // the color you want to remove float alpha = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) ? 0.0f: 1.0f; // Calculate premultiplied alpha values for the cube c[0] = rgb[0] * alpha; c[1] = rgb[1] * alpha; c[2] = rgb[2] * alpha; c[3] = alpha; c += 4; // advance our pointer into memory for the next color value } } } // Create memory with the cube data NSData *data = [NSData dataWithBytesNocopy:cubedata length:cubedataSize freeWhenDone:YES]; CIColorCube *colorCube = [CIFilter filterWithName:@"CIColorCube"]; [colorCube setValue:@(size) forKey:@"inputCubedimension"]; // Set data for cube [colorCube setValue:data forKey:@"inputCubedata"];
所以我试图用以下内容将其翻译成Swift:
var filter = CIFilter(name: "CIColorCube") filter.setValue(ciImage,forKey: kCIInputimageKey) filter.setDefaults() var size: UInt = 64 var floatSize = UInt(sizeof(Float)) var cubedataSize:size_t = size * size * size * floatSize * 4 var colorCubedata:Array<Float> = [ 0,1,1 ] var cubedata:NSData = NSData(bytesNocopy: colorCubedata,length: cubedataSize)
但是,在尝试创建多维数据集数据时出现错误:
"Extra argument 'bytesNocopy' in call"
基本上我创建的cubedata错了.你能告诉我如何在Swift中正确创建cubedata对象吗?
谢谢!
解决方法
看起来你是在色度键过滤器配方
described here之后.这里有一些有效的代码.你得到一个透明颜色的过滤器,由它的HSV角度描述:
func RGBtoHSV(r : Float,g : Float,b : Float) -> (h : Float,s : Float,v : Float) { var h : CGFloat = 0 var s : CGFloat = 0 var v : CGFloat = 0 let col = UIColor(red: CGFloat(r),green: CGFloat(g),blue: CGFloat(b),alpha: 1.0) col.getHue(&h,saturation: &s,brightness: &v,alpha: nil) return (Float(h),Float(s),Float(v)) } func colorCubeFilterForChromakey(hueAngle: Float) -> CIFilter { let hueRange: Float = 60 // degrees size pie shape that we want to replace let minHueAngle: Float = (hueAngle - hueRange/2.0) / 360 let maxHueAngle: Float = (hueAngle + hueRange/2.0) / 360 let size = 64 var cubedata = [Float](repeating: 0,count: size * size * size * 4) var rgb: [Float] = [0,0] var hsv: (h : Float,v : Float) var offset = 0 for z in 0 ..< size { rgb[2] = Float(z) / Float(size) // blue value for y in 0 ..< size { rgb[1] = Float(y) / Float(size) // green value for x in 0 ..< size { rgb[0] = Float(x) / Float(size) // red value hsv = RGBtoHSV(r: rgb[0],g: rgb[1],b: rgb[2]) // the condition checking hsv.s may need to be removed for your use-case let alpha: Float = (hsv.h > minHueAngle && hsv.h < maxHueAngle && hsv.s > 0.5) ? 0 : 1.0 cubedata[offset] = rgb[0] * alpha cubedata[offset + 1] = rgb[1] * alpha cubedata[offset + 2] = rgb[2] * alpha cubedata[offset + 3] = alpha offset += 4 } } } let b = cubedata.withUnsafeBufferPointer { Data(buffer: $0) } let data = b as NSData let colorCube = CIFilter(name: "CIColorCube",withInputParameters: [ "inputCubedimension": size,"inputCubedata": data ]) return colorCube! }
然后进行过滤器调用
让chromakeyFilter = colorCubeFilterForChromakey(hueAngle:120)
我使用120作为标准绿屏.