尽管SiLo的回答非常详细,但是这里的特定问题被Ross在其下面的评论中回答了,因此我想扩展这个答案。
我最近需要这样做是为了通过Swift与我的GPUImage框架进行接口。对于我的Harris角点检测器,我在每个处理过的帧上使用回调块,该块提供了一个OpenGL浮点值的C数组,其中包含X、Y坐标对,以及该数组的大小(以对为单位)。由于这将在实时视频上每秒提供30-60次,我使用C数组来提高性能。在Objective-C中,我会使用以下代码进行设置:
UIImage *sourceImage = [UIImage imageNamed:@"ChairTest.png"];
GPUImageHarrisCornerDetector *cornerDetector = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[cornerDetector setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
NSLog(@"Number of corners detected: %d", cornersDetected);
NSLog(@"Corner 1, X: %f, Y: %f", cornerArray[0], cornerArray[1]);
}];
GPUImagePicture *inputPicture = [[GPUImagePicture alloc] initWithImage:sourceImage];
[inputPicture addTarget:cornerDetector];
[inputPicture processImage];
在我破译了正确的闭包语法后,我仍然无法弄清楚如何访问输入C数组的值,在那里我将角落坐标移交给处理块。 Sean Heber关于这个问题的推文 指出了一种做法,我用它将上面的Objective-C代码翻译成了以下Swift代码:
let sourceImage = UIImage(named: "ChairTest.png")
let cornerDetector = GPUImageHarrisCornerDetectionFilter()
cornerDetector.cornersDetectedBlock = { (cornerArray:CMutablePointer<GLfloat>, cornersDetected:Int, frameTime:CMTime) in
println("Number of corners detected: \(cornersDetected)")
let corners = UnsafePointer<GLfloat>(cornerArray)
println("Corner 1, X: \(corners[0]) Y: \(corners[1])")
}
let inputPicture = GPUImagePicture(image: sourceImage)
inputPicture.addTarget(cornerDetector)
inputPicture.processImage()
这两种写法在功能上看起来是一样的。使用
.withUnsafePointer()
可能更安全,但我还没有掌握它的语法。
values
作为GCFloats
数组。 - Ross KimesCGFloat[]
应该足够了,我相信 Swift 会将任何指针转换为数组(类似于 C# 在与 C 库进行交互时的方式)。 - ErikCMutablePointer<CGFloat>
更改为CGFloat[]
,它会显示CMutablePointer<CGFloat>
不是CGFloat[]
的子类型。 - Ross KimesCMutablePointer<CGFloat>
дёҚеҸҳгҖӮжӮЁеҸҜд»ҘдҪҝз”ЁArray<CGFloat>.convertFromHeapArray(...)
пјҢе№¶дј е…ҘжқҘиҮӘCMutablePointer
зҡ„RawPointer
е’Ңowner
еұһжҖ§гҖӮиҷҪ然еҜ№жҲ‘жқҘиҜҙиҝҷиҝҳжҳҜжңүдәӣеҶ’йҷ©гҖӮ - Eriklet data = UnsafePointer<CGFloat>(values) data[0] = CGFloat(graphView.centerOffsets[index])
。谢谢! - Ross Kimes