iOS:PHAsset&检测DNG RAW格式

时间:2017-09-25 16:01:17

标签: ios xcode uicollectionview phasset dng

我获得了Apple的' SamplePhotosApp '的示例代码,并在相册网格照片布局中,尝试检测DNG RAW文件(如果是DNG则贴上徽章) 。

默认 cellForItemAt

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let asset = fetchResult.object(at: indexPath.item)

        // Dequeue a GridViewCell.
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: GridViewCell.self), for: indexPath) as? GridViewCell
            else { fatalError("unexpected cell in collection view") }

        // Add a badge to the cell if the PHAsset represents a Live Photo.
        if asset.mediaSubtypes.contains(.photoLive) {
            cell.livePhotoBadgeImage = PHLivePhotoView.livePhotoBadgeImage(options: .overContent)
        }

        // Request an image for the asset from the PHCachingImageManager.
        cell.representedAssetIdentifier = asset.localIdentifier
        imageManager.requestImage(for: asset, targetSize: thumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: { image, _ in
            // The cell may have been recycled by the time this handler gets called;
            // set the cell's thumbnail image only if it's still showing the same asset.
            if cell.representedAssetIdentifier == asset.localIdentifier {
                cell.thumbnailImage = image
            }
        })

        return cell

    }

DNG / RAW格式

使用DNG文件时,可能会嵌入预览或缩略图(包含iOS11),当然还有一个完全独立的JPEG。

使用上面的代码, requestImage 仍会通过拉出其嵌入的JPEG来显示DNG文件。但是,它不知道 PHAsset 实际上是DNG文件。

如何确定PHAsset是否为DNG?

我尝试的事情

let fileExtension = ((asset.value(forKey: "uniformTypeIdentifier") as! NSString).pathExtension as NSString).uppercased
if fileExtension == "DNG" || fileExtension == "RAW-IMAGE" {
     //Show RAW Badge
}

仅当DNG文件只嵌入了预览JPEG时,才能正常工作。如果它嵌入了常规的全尺寸JPEG,则会将PHAsset识别为JPEG。

我被告知试试这个:

let res = PHAssetResource.assetResources(for: asset)

但是某个资产可能有多个资源(调整数据等)。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

一些概念背景:PhotoKit中有三种级别可供使用...

  • 当您与PHAsset和朋友合作时,您处于抽象模型级别。每个资产都是照片数据库中的一个条目 - 一个单独的“东西”,在照片应用程序中显示为缩略图。在这一层,它只是一个“东西”(不是说,像素缓冲区或视频数据流)。

  • 当您使用PHImageManager时,您仍然在抽象地工作。你告诉PhotoKit,“给我一个图像(或视频),这是在这些情况中向用户显示此资产的合适方式。”什么类型的文件包含资产的原始数据仍在此级别抽象出来。

  • 这些抽象“事物”中的每一个都可能有一个或多个原始文件提供其图像或视频数据,内在元数据等。要处理此类问题(包括文件格式),您需要使用{ {1}}(可能还有PHAssetResource)。

因此,如果您想了解资产是否包含RAW或DNG数据,您需要查看其资源。

  1. 使用PHAssetResource PHAssetResourceManager assetResources(for:)获取与资产相对应的资源集。

  2. 通过检查每个资源的type属性来缩小资源列表 - 由RAW或DNG文件支持的资产应将其存储在.类型的资源中。 (尽管第三方应用程序至少有可能使用alternatePhoto类型编写DNG文件,因此您也可以在那里查看。)

  3. 检查缩小列表中每个资源的uniformTypeIdentifier属性。 DNG文件的UTI是fullSizePhoto(在Xcode 9中有一个字符串常量,AVFileTypeDNG)。如果您只想要DNG文件,这可能很好,但是为了更广泛地检查RAW文件,可能更好地测试资源的UTI是否符合"public.camera-raw-image" aka kUTTypeRawImage