ios – 在Swift中使用CIColorCube过滤器
发布时间:2020-12-14 17:43:27 所属栏目:百科 来源:网络整理
导读:我想让CIColorCube过滤器工作.但是,Apple文档仅提供了一个解释不佳的参考示例: // Allocate memoryconst unsigned int size = 64;float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);float rgb[3],hsv[3],*c = cubeData;// Popu
我想让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作为标准绿屏. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |