// Allocate memoryconst 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 1for (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 dataNSData *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: ) } let data = b as NSData let colorCube = CIFilter(name: "CIcolorCube",withinputParameters: [ "inputCubedimension": size,"inputCubedata": data ]) return colorCube!}
然后进行过滤器调用
让chromakeyFilter = colorCubeFilterForChromakey(hueAngle:120)
我使用120作为标准绿屏.
总结以上是内存溢出为你收集整理的ios – 在Swift中使用CIColorCube过滤器全部内容,希望文章能够帮你解决ios – 在Swift中使用CIColorCube过滤器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)