我获得了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文件时,可能会嵌入预览或缩略图(包含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)
但是某个资产可能有多个资源(调整数据等)。我怎样才能做到这一点?
答案 0 :(得分:4)
一些概念背景:PhotoKit中有三种级别可供使用...
当您与PHAsset
和朋友合作时,您处于抽象模型级别。每个资产都是照片数据库中的一个条目 - 一个单独的“东西”,在照片应用程序中显示为缩略图。在这一层,它只是一个“东西”(不是说,像素缓冲区或视频数据流)。
当您使用PHImageManager
时,您仍然在抽象地工作。你告诉PhotoKit,“给我一个图像(或视频),这是在这些情况中向用户显示此资产的合适方式。”什么类型的文件包含资产的原始数据仍在此级别抽象出来。
这些抽象“事物”中的每一个都可能有一个或多个原始文件提供其图像或视频数据,内在元数据等。要处理此类问题(包括文件格式),您需要使用{ {1}}(可能还有PHAssetResource
)。
因此,如果您想了解资产是否包含RAW或DNG数据,您需要查看其资源。
使用PHAssetResource
PHAssetResourceManager
assetResources(for:)
获取与资产相对应的资源集。
通过检查每个资源的type
属性来缩小资源列表 - 由RAW或DNG文件支持的资产应将其存储在.
类型的资源中。 (尽管第三方应用程序至少有可能使用alternatePhoto
类型编写DNG文件,因此您也可以在那里查看。)
检查缩小列表中每个资源的uniformTypeIdentifier
属性。 DNG文件的UTI是fullSizePhoto
(在Xcode 9中有一个字符串常量,AVFileTypeDNG)。如果您只想要DNG文件,这可能很好,但是为了更广泛地检查RAW文件,可能更好地测试资源的UTI是否符合"public.camera-raw-image"
aka kUTTypeRawImage
。