【问题标题】:How to read exif data from UIImage in swift 4?如何在 swift 4 中从 UIImage 读取 exif 数据?
【发布时间】:2018-05-29 10:56:40
【问题描述】:

我有一张包含很多 exif informations 的图片。但是当试图用swift读取exif信息时,它显示的exif信息数量有限。

我试过以下代码:

let data = UIImageJPEGRepresentation(image, 1.0)
let source = CGImageSourceCreateWithData(data! as CFData, nil)
let metadata = (CGImageSourceCopyPropertiesAtIndex(source!, 0, nil))
debugPrint(metadata ?? "nil")

它会打印以下结果:

    {
    ColorModel = RGB;
    Depth = 8;
    Orientation = 6;
    PixelHeight = 2448;
    PixelWidth = 3264;
    ProfileName = "sRGB IEC61966-2.1";
    "{Exif}" =     {
        ColorSpace = 1;
        PixelXDimension = 3264;
        PixelYDimension = 2448;
    };
    "{JFIF}" =     {
        DensityUnit = 0;
        JFIFVersion =         (
            1,
            0,
            1
        );
        XDensity = 72;
        YDensity = 72;
    };
    "{TIFF}" =     {
        Orientation = 6;
    };
}

如何从 UIImage 中读取所有 exif 信息?

【问题讨论】:

  • 你能检查一下我附在那儿的图片吗?有我试图访问的所有图像信息。我的问题是为什么它没有打印所有的 exif 信息。
  • 我无法给你一个好的答案,但我所看到的表明它可能不是你的代码提取的一部分。我只是使用UIImagePickerController 相机和UIImagePickerControllerMediaMetadata 来查看所有EXIF 数据并保存图像。但后来我在所述图像上使用了你的代码(这也是我会做的),发现 CGImageSourceCopyPropertiesAtIndex 只有你发现的 - 一个不完整的数据字典。

标签: ios swift uiimage core-image


【解决方案1】:

如果您的图像是使用 avcapturesession 捕获的,那么以下是提取 exif 数据的代码。

photoFileOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: {(sampleBuffer, error) in
                if (sampleBuffer != nil) {
                        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer!)
                        let image = self.processPhoto(imageData!)
                        let source: CGImageSource = CGImageSourceCreateWithData((imageData as! CFMutableData), nil)!

                        let metadata = CGImageSourceCopyPropertiesAtIndex(source, 0,nil) as! [String:Any]

                        print("exif data = \(metadata![kCGImagePropertyExifDictionary as String] as? [String : AnyObject]) ")

                        completionHandler(true)
                    } else {
                        completionHandler(false)
                    }
                }

【讨论】:

    【解决方案2】:

    我怀疑UIImageJPEGRepresentation 函数是罪魁祸首,因为它执行从 HEIC 到 JPEG 的转换(假设您从照片应用程序中提取图像)。在此转换过程中,许多有价值的 Exif 标签(包括地理位置等)似乎都丢失了。

    【讨论】:

      【解决方案3】:

      如果你有图像数据,你可以用它创建一个 CIImage 并读取它的属性,你会在那里找到 EXIF 数据。我尝试使用 UIImage,获取 JPEG 数据并从那里读取 EXIF,但我只得到了与您在帖子中打印的相同的值。我认为一些 EXIF 的东西在 jpeg 转换中被去掉了。通过使用 CIImage,我可以获得 LensMode、ISO、曝光时间等。

      这是一个使用 PHImageManager 的示例,我在其中读取所有图像并打印 EXIF 数据

      private func getPhotos() {
              let manager = PHImageManager.default()
              let requestOptions = PHImageRequestOptions()
              requestOptions.isSynchronous = true
              requestOptions.deliveryMode = .fastFormat
              let fetchOptions = PHFetchOptions()
              fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
      
              let results: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
              if results.count > 0 {
                  for i in 0..<results.count {
                      let asset = results.object(at: i)
                      manager.requestImageDataAndOrientation(for: asset, options: requestOptions) { (data, fileName, orientation, info) in
                          if let data = data,
                             let cImage = CIImage(data: data) {
                              let exif = cImage.properties["{Exif}"]
                              print("EXIF Data: \(exif)")
                          }
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2012-04-03
        • 1970-01-01
        • 2012-05-16
        • 2020-04-22
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多