从 PHAsset 中提取元数据返回意外的 nil 值

Posted

技术标签:

【中文标题】从 PHAsset 中提取元数据返回意外的 nil 值【英文标题】:Extract Metadata from PHAsset returns unexpected nil value 【发布时间】:2017-03-10 07:17:55 【问题描述】:

我尝试从 question 中提到的 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 

正如question 中所述,我尝试使用kCGImageProperty 值访问元数据。但它永远不会进入if-statement,当我在调试器中使用po fullImageMetadata?[kCGImageProperty[...] as String] 打印数据时,我得到 nil 返回。

但不知何故,这需要工作还是不工作?谁能看到我的错误或知道那里出了什么问题?

【问题讨论】:

【参考方案1】:

使用带有kCGImageProperty 变量的ios 示例无法解决我的问题。相反,我通过将字典分成不同的部分来解决它。

以获取 Exif 元数据为例,我使用了这行代码:

let exifDict = fullImageMetadata?["Exif"] as! NSDictionary

然后尝试使用以下代码提取属性:

if let flash = exifDict["Flash"] as? NSNumber 
    [doing some wild stuff here]

对于我需要从图像中提取的不同属性等等。

【讨论】:

以上是关于从 PHAsset 中提取元数据返回意外的 nil 值的主要内容,如果未能解决你的问题,请参考以下文章

在获取 PHAsset 路径时展开可选值时意外发现 nil [重复]

照片框架 - 如何从 PHAsset 获取图像的 CLLocation?

PHAsset fetch 将 50% 的集合返回为 nil

使用 PHImageManager 时,PHAsset 返回 UIImage 的 nil 值

PHAsset 视频 EXIF 元数据检索

使用 mediaType Video 从 PHAsset 修改元数据失败