【问题标题】:Error getting EXIF information in Swift 3/4在 Swift 3/4 中获取 EXIF 信息时出错
【发布时间】:2018-02-26 17:29:03
【问题描述】:

我想从 PhotoLibrary 中的图像中获取 EXIF 数据,但找不到正确的方法。我使用了来自this questionthis one 的答案。我得到以下控制台输出:

imageSource:  <UIImage: 0x6080000b8a20> size {3000, 2002} orientation 0 scale 1.000000
2017-09-18 11:24:28.513567+0300 PhotoTest[10581:6526935] CGImageSourceCopyPropertiesAtIndex:3517: *** ERROR: CGImageSourceCopyPropertiesAtIndex: source is not a CGImageSourceRef
2017-09-18 11:24:29.071412+0300 PhotoTest[10581:6527417] [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

这是我当前的代码尝试。我会很感激任何解决方案或想法。我一直在摸索各种方法,但我对imageIO的了解还不够,无法解决问题。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    self.dismiss(animated: true, completion: nil)

    let bigImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    photoImageView.image = bigImage

     imageData = UIImagePNGRepresentation(bigImage!) as NSData?


    if let imageSource = info[UIImagePickerControllerOriginalImage] {
         print("imageSource: ", imageSource)

        let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource as! CGImageSource, 0, nil)


         //print("imageProperties: ", imageProperties!)
        if let dict = imageProperties as? [String: Any] {
            print(dict)
        }
    }

    dismiss(animated: true, completion: nil)
}

【问题讨论】:

    标签: image-processing swift3 exif


    【解决方案1】:

    你看到的是:

    *** ERROR: CGImageSourceCopyPropertiesAtIndex: source is not a CGImageSourceRef
    

    行,因为您需要通过 CGImageSourceCreate... API 之一创建您的 imageSource

    尝试这样做:

        if let bigImage = info[UIImagePickerControllerOriginalImage] as? UIImage
        {
            if let imageData = UIImagePNGRepresentation(bigImage)
            {
                if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil)
                {
                    print("imageSource: ", imageSource)
    
                    let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)
    
                    //print("imageProperties: ", imageProperties!)
                    if let dict = imageProperties as? [String: Any] {
                        print(dict)
                    }
                }
            }
        }
    

    【讨论】:

    • 非常感谢。我得到了一些我需要的东西。但是,我仍然看到这个控制台日志:`发现扩展时遇到的 [discovery] 错误:Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}`这可能是 iOS11 问题吗?
    • 看起来像issue with iOS 11
    • 好的 .. 一个后续。我只看到“色度”列表。我还应该做些什么来获取位置和相机信息吗?再次,非常感谢
    • 啊。好的,相机信息呢?
    【解决方案2】:

    我找到了一个不同的解决方案,如下:

    import Photos 
    import PhotosUI
    
     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    
            let assetURL = info[UIImagePickerControllerReferenceURL] as! NSURL
            let asset = PHAsset.fetchAssets(withALAssetURLs: [assetURL as URL], options: nil)
            guard let result = asset.firstObject else {
                return
            }
    
            let imageManager = PHImageManager.default()
            imageManager.requestImageData(for: result , options: nil, resultHandler:{
                (data, responseString, imageOriet, info) -> Void in
                let imageData: NSData = data! as NSData
                if let imageSource = CGImageSourceCreateWithData(imageData, nil) {
                    let imageProperties2 = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil)! as NSDictionary
                    print("imageProperties2: ", imageProperties2)
                }
    
            })
            dismiss(animated: true, completion: nil)
        }
    

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案3】:
      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
          if let exifData = info[.mediaMetadata] as? [String: Any] {
              //print(exifData)
          }
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • 问题表明来源不会是相机。 “此键仅在使用源类型设置为 UIImagePickerController.SourceType.camera 的图像选择器时有效,并且仅适用于静止图像。” developer.apple.com/documentation/uikit/uiimagepickercontroller/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多