ios – 在Swift中使用CIColorCube过滤器

ios – 在Swift中使用CIColorCube过滤器,第1张

概述我想让CIColorCube过滤器工作.但是,Apple文档仅提供了一个解释不佳的参考示例: // Allocate memoryconst unsigned int size = 64;float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);float rgb[3], hsv[3], *c = 我想让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;// 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过滤器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1016036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存