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, вам нужно посмотреть на его ресурсы.

  1. использование PHAssetResource.assetResources(for:) получить набор ресурсов, соответствующий активу.

  2. Сузьте список ресурсов, проверив type свойство для каждого - актив, поддерживаемый файлом RAW или DNG, должен хранить его в ресурсе alternatePhoto тип. (Хотя есть хоть какая-то возможность, что сторонние приложения могут записывать файлы DNG, используя fullSizePhoto типа, так что вы можете проверить там тоже.)

  3. Проверить uniformTypeIdentifier свойство для каждого ресурса в вашем суженном списке. UTI для файлов DNG "com.adobe.raw-image" (в Xcode 9 есть строковая константа для этого, AVFileTypeDNG). Это, вероятно, хорошо, если вы хотите только файлы DNG, но для более широкой проверки файлов RAW, вероятно, лучше проверить, соответствует ли UTI ресурса "public.camera-raw-image" ака kUTTypeRawImage,

Другие вопросы по тегам