2016-04-29 63 views
0

我在阅读GCD教程https://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1CIFeature现在没有会员已经发布了EyeEositionPosition

当我下载开工项目,建设,我得到了一些错误:

private extension PhotoDetailViewController { 
    func faceOverlayImageFromImage(image: UIImage) -> UIImage { 
    let detector = CIDetector(ofType: CIDetectorTypeFace, 
        context: nil, 
        options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) 

    // Get features from the image 
    let newImage = CIImage(CGImage: image.CGImage!) 
    let features = detector.featuresInImage(newImage) 

    UIGraphicsBeginImageContext(image.size) 
    let imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) 

    // Draws this in the upper left coordinate system 
    image.drawInRect(imageRect, blendMode: CGBlendMode.Normal, alpha: 1.0) 

    let context = UIGraphicsGetCurrentContext() 
    for faceFeature in features { 
     let faceRect = faceFeature.bounds 
     CGContextSaveGState(context) 

     // CI and CG work in different coordinate systems, we should translate to 
     // the correct one so we don't get mixed up when calculating the face position. 
     CGContextTranslateCTM(context, 0.0, imageRect.size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 

     if faceFeature.hasLeftEyePosition { 
     let leftEyePosition = faceFeature.leftEyePosition 
     let eyeWidth = faceRect.size.width/FaceBoundsToEyeScaleFactor 
     let eyeHeight = faceRect.size.height/FaceBoundsToEyeScaleFactor 
     let eyeRect = CGRect(x: leftEyePosition.x - eyeWidth/2.0, 
      y: leftEyePosition.y - eyeHeight/2.0, 
      width: eyeWidth, 
      height: eyeHeight) 
     drawEyeBallForFrame(eyeRect) 
     } 

     if faceFeature.hasRightEyePosition { 
     let leftEyePosition = faceFeature.rightEyePosition 
     let eyeWidth = faceRect.size.width/FaceBoundsToEyeScaleFactor 
     let eyeHeight = faceRect.size.height/FaceBoundsToEyeScaleFactor 
     let eyeRect = CGRect(x: leftEyePosition.x - eyeWidth/2.0, 
      y: leftEyePosition.y - eyeHeight/2.0, 
      width: eyeWidth, 
      height: eyeHeight) 
     drawEyeBallForFrame(eyeRect) 
     } 

     CGContextRestoreGState(context); 
    } 

    let overlayImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return overlayImage 
    } 

在这一行faceFeature.hasLeftEyePosition,它说:

Value of type 'CIFeature' has no member 'hasLeftEyePosition'

那么如何解决这个问题。

任何帮助,将不胜感激。谢谢。

+0

只有['CIFaceFeature'(HTTPS: //developer.apple.com/library/ios/documentation/CoreImage/Reference/CIFaceFeature/index.html#//apple_ref/occ/cl/CIFaceFeature)拥有这样的属性。你需要施放它。 – HAS

回答

1

我刚刚下载了你提到的项目,它对我有用(更新到最新的Swift版本之后)。

你缺少的重要的一块是在你设置features的9号线:

let features = detector.featuresInImage(newImage) 

这必须是

let features = detector.featuresInImage(newImage) as! [CIFaceFeature] 

我强烈反对力量铸造,但由于这不是一个生产应用程序,我很好。如果你想确保你永远不会崩溃(如果有人改变从“面子” CIDetectorType其它东西)可以保护它,并返回输入的图像,而不是:

guard let features = detector.featuresInImage(newImage) as? [CIFaceFeature] else { return image } 
+0

没有工作。当我像你一样改变时,它说'使用未声明的标识符'Utils'' – Khuong

+1

是的,它确实有效。这是另一个问题。你需要从'NSObject'继承'Utils'。 – HAS

+0

是的。现在它工作。谢谢;) – Khuong

相关问题