不是CGImageSourceCopyPropertiesAtIndex检索到的所有图像元数据



我正试图使用以下代码从Xcode 13中的Swift项目中的iOS中的iPhone 8相册图像中检索所有元数据:

if let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage {
let url  = info[UIImagePickerController.InfoKey.imageURL.rawValue]
let source = CGImageSourceCreateWithURL(url as! CFURL, nil)
let metadata = CGImageSourceCopyPropertiesAtIndex(source!,0,nil) as? [AnyHashable: Any]

然而,若我打印出元数据,就不会显示GPS或Camera元数据,也不会显示EXIF数据的某些字段。输出如下。如何访问所有图像元数据?

(lldb) po metadata
▿ Optional<Dictionary<AnyHashable, Any>>
▿ some : 10 elements
▿ 0 : 2 elements
▿ key : AnyHashable("Orientation")
- value : "Orientation"
- value : 1
▿ 1 : 2 elements
▿ key : AnyHashable("DPIWidth")
- value : "DPIWidth"
- value : 72
▿ 2 : 2 elements
▿ key : AnyHashable("PixelWidth")
- value : "PixelWidth"
- value : 4032
▿ 3 : 2 elements
▿ key : AnyHashable("ColorModel")
- value : "ColorModel"
- value : RGB
▿ 4 : 2 elements
▿ key : AnyHashable("Depth")
- value : "Depth"
- value : 8
▿ 5 : 2 elements
▿ key : AnyHashable("{Exif}")
- value : "{Exif}"
▿ value : 7 elements
▿ 0 : 2 elements
- key : ColorSpace
- value : 1
▿ 1 : 2 elements
- key : PixelXDimension
- value : 4032
▿ 2 : 2 elements
- key : ExifVersion
▿ value : 3 elements
- 0 : 2
- 1 : 2
- 2 : 1
▿ 3 : 2 elements
- key : FlashPixVersion
▿ value : 2 elements
- 0 : 1
- 1 : 0
▿ 4 : 2 elements
- key : PixelYDimension
- value : 3024
▿ 5 : 2 elements
- key : SceneCaptureType
- value : 0
▿ 6 : 2 elements
- key : ComponentsConfiguration
▿ value : 4 elements
- 0 : 1
- 1 : 2
- 2 : 3
- 3 : 0
▿ 6 : 2 elements
▿ key : AnyHashable("PixelHeight")
- value : "PixelHeight"
- value : 3024
▿ 7 : 2 elements
▿ key : AnyHashable("{TIFF}")
- value : "{TIFF}"
▿ value : 4 elements
▿ 0 : 2 elements
- key : Orientation
- value : 1
▿ 1 : 2 elements
- key : ResolutionUnit
- value : 2
▿ 2 : 2 elements
- key : XResolution
- value : 72
▿ 3 : 2 elements
- key : YResolution
- value : 72
▿ 8 : 2 elements
▿ key : AnyHashable("DPIHeight")
- value : "DPIHeight"
- value : 72
▿ 9 : 2 elements
▿ key : AnyHashable("ProfileName")
- value : "ProfileName"
- value : Display P3
(lldb) 

使用PHAsset找到了适用于iOS 13或更高版本的解决方案,如下所示。问题在于数据的创建方式。

let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)

let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage

let asset = info[UIImagePickerController.InfoKey.phAsset.rawValue] as! PHAsset

PHImageManager.default().requestImageDataAndOrientation(for: asset, options: nil) { (data, responseString, imageOrient, info) in
let imageData: NSData = data! as NSData
let source3:CGImageSource = CGImageSourceCreateWithData(imageData as CFData, nil)!
let metadata3 = CGImageSourceCopyPropertiesAtIndex(source3,0, nil) as? [AnyHashable: Any]
//use metadata3 which contains all metadata for jpeg files but executed asynchronously
}

最新更新