从 PHAsset returns 中提取元数据意外的 nil 值
Extract Metadata from PHAsset returns unexpected nil value
我尝试从 中提到的 PHAsset 中提取元数据。
我尝试提取 FocalLength 或 Aperture 等元数据。
这是我当前的代码:
let options = PHContentEditingInputRequestOptions()
options.isNetworkAccessAllowed = true
phAsset.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput, _) -> Void in
let fullImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)
let fullImageMetadata = fullImage?.properties
if let focalLength = fullImageMetadata?[kCGImagePropertyExifFocalLength as String] {
print(focalLength)
}
})
当我使用命令 po fullImageMetadata
时,我的示例图像得到以下输出:
▿ Optional<Dictionary<String, Any>>
▿ some : 12 elements
▿ 0 : 2 elements
- .0 : "PixelHeight"
- .1 : 2304
▿ 1 : 2 elements
- .0 : "{JFIF}"
▿ .1 : 4 elements
▿ 0 : 2 elements
- .0 : DensityUnit
- .1 : 0
▿ 1 : 2 elements
- .0 : YDensity
- .1 : 72
▿ 2 : 2 elements
- .0 : JFIFVersion
▿ .1 : 3 elements
- 0 : 1
- 1 : 0
- 2 : 1
▿ 3 : 2 elements
- .0 : XDensity
- .1 : 72
▿ 2 : 2 elements
- .0 : "{Exif}"
▿ .1 : 14 elements
▿ 0 : 2 elements
- .0 : DateTimeDigitized
- .1 : 2010:01:28 10:54:24
▿ 1 : 2 elements
- .0 : ExposureProgram
- .1 : 1
▿ 2 : 2 elements
- .0 : PixelXDimension
- .1 : 1536
▿ 3 : 2 elements
- .0 : ExposureBiasValue
- .1 : 0
▿ 4 : 2 elements
- .0 : Flash
- .1 : 16
▿ 5 : 2 elements
- .0 : DateTimeOriginal
- .1 : 2010:01:28 10:54:24
▿ 6 : 2 elements
- .0 : MeteringMode
- .1 : 3
▿ 7 : 2 elements
- .0 : PixelYDimension
- .1 : 2304
▿ 8 : 2 elements
- .0 : ISOSpeedRatings
▿ .1 : 1 element
- 0 : 100
▿ 9 : 2 elements
- .0 : ExposureTime
- .1 : 0.00625
▿ 10 : 2 elements
- .0 : ApertureValue
- .1 : 5.375
▿ 11 : 2 elements
- .0 : ColorSpace
- .1 : 1
▿ 12 : 2 elements
- .0 : ExifVersion
▿ .1 : 2 elements
- 0 : 2
- 1 : 2
▿ 13 : 2 elements
- .0 : FocalLength
- .1 : 30
▿ 3 : 2 elements
- .0 : "DPIWidth"
- .1 : 72
▿ 4 : 2 elements
- .0 : "Depth"
- .1 : 8
▿ 5 : 2 elements
- .0 : "ProfileName"
- .1 : sRGB IEC61966-2.1
▿ 6 : 2 elements
- .0 : "Orientation"
- .1 : 1
▿ 7 : 2 elements
- .0 : "{TIFF}"
▿ .1 : 8 elements
▿ 0 : 2 elements
- .0 : ResolutionUnit
- .1 : 2
▿ 1 : 2 elements
- .0 : Software
- .1 : Adobe Photoshop CS3 Macintosh
▿ 2 : 2 elements
- .0 : DateTime
- .1 : 2010:04:12 16:29:18
▿ 3 : 2 elements
- .0 : XResolution
- .1 : 72
▿ 4 : 2 elements
- .0 : Orientation
- .1 : 1
▿ 5 : 2 elements
- .0 : YResolution
- .1 : 72
▿ 6 : 2 elements
- .0 : Model
- .1 : Canon EOS 5D Mark II
▿ 7 : 2 elements
- .0 : Make
- .1 : Canon
▿ 8 : 2 elements
- .0 : "{IPTC}"
▿ .1 : 4 elements
▿ 0 : 2 elements
- .0 : DigitalCreationTime
- .1 : 105424+0100
▿ 1 : 2 elements
- .0 : DigitalCreationDate
- .1 : 20100128
▿ 2 : 2 elements
- .0 : DateCreated
- .1 : 20100128
▿ 3 : 2 elements
- .0 : TimeCreated
- .1 : 105424+0100
▿ 9 : 2 elements
- .0 : "ColorModel"
- .1 : RGB
▿ 10 : 2 elements
- .0 : "DPIHeight"
- .1 : 72
▿ 11 : 2 elements
- .0 : "PixelWidth"
- .1 : 1536
如 中所述,我尝试使用 kCGImageProperty
值访问元数据。但它永远不会进入 if
语句,当我在调试器中使用 po fullImageMetadata?[kCGImageProperty[...] as String]
打印数据时,我得到 nil 返回。
但是不知何故这是否需要工作?任何人都可以看到我的错误或知道那里有什么问题吗?
使用 iOS 中的示例和 kCGImageProperty
变量无法解决我的问题。相反,我通过将词典拆分成不同的部分来解决它。
例如,为了获取 Exif 元数据,我使用了这行代码:
let exifDict = fullImageMetadata?["{Exif}"] as! NSDictionary
然后尝试使用以下代码提取属性:
if let flash = exifDict["Flash"] as? NSNumber {
[doing some wild stuff here]
}
等等我需要从图像中提取的不同属性。
我尝试从
我尝试提取 FocalLength 或 Aperture 等元数据。
这是我当前的代码:
let options = PHContentEditingInputRequestOptions()
options.isNetworkAccessAllowed = true
phAsset.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput, _) -> Void in
let fullImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)
let fullImageMetadata = fullImage?.properties
if let focalLength = fullImageMetadata?[kCGImagePropertyExifFocalLength as String] {
print(focalLength)
}
})
当我使用命令 po fullImageMetadata
时,我的示例图像得到以下输出:
▿ Optional<Dictionary<String, Any>>
▿ some : 12 elements
▿ 0 : 2 elements
- .0 : "PixelHeight"
- .1 : 2304
▿ 1 : 2 elements
- .0 : "{JFIF}"
▿ .1 : 4 elements
▿ 0 : 2 elements
- .0 : DensityUnit
- .1 : 0
▿ 1 : 2 elements
- .0 : YDensity
- .1 : 72
▿ 2 : 2 elements
- .0 : JFIFVersion
▿ .1 : 3 elements
- 0 : 1
- 1 : 0
- 2 : 1
▿ 3 : 2 elements
- .0 : XDensity
- .1 : 72
▿ 2 : 2 elements
- .0 : "{Exif}"
▿ .1 : 14 elements
▿ 0 : 2 elements
- .0 : DateTimeDigitized
- .1 : 2010:01:28 10:54:24
▿ 1 : 2 elements
- .0 : ExposureProgram
- .1 : 1
▿ 2 : 2 elements
- .0 : PixelXDimension
- .1 : 1536
▿ 3 : 2 elements
- .0 : ExposureBiasValue
- .1 : 0
▿ 4 : 2 elements
- .0 : Flash
- .1 : 16
▿ 5 : 2 elements
- .0 : DateTimeOriginal
- .1 : 2010:01:28 10:54:24
▿ 6 : 2 elements
- .0 : MeteringMode
- .1 : 3
▿ 7 : 2 elements
- .0 : PixelYDimension
- .1 : 2304
▿ 8 : 2 elements
- .0 : ISOSpeedRatings
▿ .1 : 1 element
- 0 : 100
▿ 9 : 2 elements
- .0 : ExposureTime
- .1 : 0.00625
▿ 10 : 2 elements
- .0 : ApertureValue
- .1 : 5.375
▿ 11 : 2 elements
- .0 : ColorSpace
- .1 : 1
▿ 12 : 2 elements
- .0 : ExifVersion
▿ .1 : 2 elements
- 0 : 2
- 1 : 2
▿ 13 : 2 elements
- .0 : FocalLength
- .1 : 30
▿ 3 : 2 elements
- .0 : "DPIWidth"
- .1 : 72
▿ 4 : 2 elements
- .0 : "Depth"
- .1 : 8
▿ 5 : 2 elements
- .0 : "ProfileName"
- .1 : sRGB IEC61966-2.1
▿ 6 : 2 elements
- .0 : "Orientation"
- .1 : 1
▿ 7 : 2 elements
- .0 : "{TIFF}"
▿ .1 : 8 elements
▿ 0 : 2 elements
- .0 : ResolutionUnit
- .1 : 2
▿ 1 : 2 elements
- .0 : Software
- .1 : Adobe Photoshop CS3 Macintosh
▿ 2 : 2 elements
- .0 : DateTime
- .1 : 2010:04:12 16:29:18
▿ 3 : 2 elements
- .0 : XResolution
- .1 : 72
▿ 4 : 2 elements
- .0 : Orientation
- .1 : 1
▿ 5 : 2 elements
- .0 : YResolution
- .1 : 72
▿ 6 : 2 elements
- .0 : Model
- .1 : Canon EOS 5D Mark II
▿ 7 : 2 elements
- .0 : Make
- .1 : Canon
▿ 8 : 2 elements
- .0 : "{IPTC}"
▿ .1 : 4 elements
▿ 0 : 2 elements
- .0 : DigitalCreationTime
- .1 : 105424+0100
▿ 1 : 2 elements
- .0 : DigitalCreationDate
- .1 : 20100128
▿ 2 : 2 elements
- .0 : DateCreated
- .1 : 20100128
▿ 3 : 2 elements
- .0 : TimeCreated
- .1 : 105424+0100
▿ 9 : 2 elements
- .0 : "ColorModel"
- .1 : RGB
▿ 10 : 2 elements
- .0 : "DPIHeight"
- .1 : 72
▿ 11 : 2 elements
- .0 : "PixelWidth"
- .1 : 1536
如 kCGImageProperty
值访问元数据。但它永远不会进入 if
语句,当我在调试器中使用 po fullImageMetadata?[kCGImageProperty[...] as String]
打印数据时,我得到 nil 返回。
但是不知何故这是否需要工作?任何人都可以看到我的错误或知道那里有什么问题吗?
使用 iOS 中的示例和 kCGImageProperty
变量无法解决我的问题。相反,我通过将词典拆分成不同的部分来解决它。
例如,为了获取 Exif 元数据,我使用了这行代码:
let exifDict = fullImageMetadata?["{Exif}"] as! NSDictionary
然后尝试使用以下代码提取属性:
if let flash = exifDict["Flash"] as? NSNumber {
[doing some wild stuff here]
}
等等我需要从图像中提取的不同属性。