iOS: PHAsset и обнаружение формата DNG RAW
Я получил образец кода 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 по- прежнему отображает файлы DNG, извлекая встроенный JPEG. Однако он не знает, что 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
и друзья, вы на уровне абстрактной модели. Каждый актив представляет собой запись в базе данных Photos - отдельную "вещь", которая отображается в виде миниатюры в приложении Photos. На этом уровне это просто "вещь" (не, скажем, пиксельный буфер или поток видеоданных).Когда вы работаете с
PHImageManager
Вы все еще работаете в абстракте. Вы говорите PhotoKit: "Дайте мне изображение (или видео), которое является подходящим способом показать этот ресурс пользователю в этих обстоятельствах ". Какие типы файлов содержат исходные данные ресурса по-прежнему абстрагированы на этом уровне.Каждая из этих абстрактных "вещей" может иметь один или несколько исходных файлов, предоставляющих свои изображения или видеоданные, внутренние метаданные и т. Д. Чтобы работать с такими проблемами (включая формат файла), вам необходимо работать с
PHAssetResource
(и, возможно,PHAssetResourceManager
).
Итак, если вы хотите узнать, содержит ли актив данные RAW или DNG, вам нужно посмотреть на его ресурсы.
использование
PHAssetResource
.
assetResources(for:)
получить набор ресурсов, соответствующий активу.Сузьте список ресурсов, проверив
type
свойство для каждого - актив, поддерживаемый файлом RAW или DNG, должен хранить его в ресурсеalternatePhoto
тип. (Хотя есть хоть какая-то возможность, что сторонние приложения могут записывать файлы DNG, используяfullSizePhoto
типа, так что вы можете проверить там тоже.)Проверить
uniformTypeIdentifier
свойство для каждого ресурса в вашем суженном списке. UTI для файлов DNG"com.adobe.raw-image"
(в Xcode 9 есть строковая константа для этого, AVFileTypeDNG). Это, вероятно, хорошо, если вы хотите только файлы DNG, но для более широкой проверки файлов RAW, вероятно, лучше проверить, соответствует ли UTI ресурса"public.camera-raw-image"
акаkUTTypeRawImage
,