iOS:PHAsset 和检测 DNG RAW 格式

Posted

技术标签:

【中文标题】iOS:PHAsset 和检测 DNG RAW 格式【英文标题】:iOS: PHAsset & Detecting DNG RAW Format 【发布时间】:2017-09-25 16:01:16 【问题描述】:

我得到了 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】:

一些概念背景:在 PhotoKit 中可以处理三个级别...

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

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

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

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

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

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

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

【讨论】:

回答得好!!

以上是关于iOS:PHAsset 和检测 DNG RAW 格式的主要内容,如果未能解决你的问题,请参考以下文章

纯RAW数据转换为DNG格式

dng格式的图片转png

RAW图片是啥格式?

Python 读取DNG格式照片数据

将其他相机拍摄的 DNG(原始照片)保存到 iOS 照片库

RAW格式文件