Swift 5 Как добавить exif-данные в изображение, полученное из PHAsset - PullRequest
1 голос
/ 15 марта 2020

У меня есть простой код для получения uiImage из библиотеки фотографий:

private func getDataOfMedia (asset:PHAsset) -> Data {
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.isNetworkAccessAllowed = true

        let imgManager = PHImageManager.default()
        var imgData = Data()
        // Request Image
        imgManager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .default, options: requestOptions) { (uiimage, info) in
            if let uiimage = uiimage {
                DispatchQueue.main.async {
                    if let imageData = uiimage.jpegData(compressionQuality: 1) {
                        imgData = imageData
                    }
                }
            }
        }
        return imgData
    }

, но, конечно, я не вижу данные камеры, данные о местоположении и данные exif изображения, сохраненного из func getDataOfMedia(asset: asset), но если я загружаю одно и то же изображение непосредственно из Photo, я могу видеть данные камеры, данные о местоположении и данные EXIF. Как я могу добавить данные камеры, данные о местоположении и данные EXIF ​​к данным, которые у меня есть от requestimage PHAsset? Как добавить уникальный идентификатор, например asset.localIdentifier, чтобы узнать, что я загрузил это изображение?

ОБНОВЛЕНИЕ Мне удалось извлечь данные камеры, данные о местоположении и данные exif из изображение из объекта актива, с этим кодом:

private func getDataOfImageC (asset:PHAsset, completion: @escaping (Data) -> Void) {
        //For get exif data
        let options = PHContentEditingInputRequestOptions()
        options.isNetworkAccessAllowed = true //download asset metadata from iCloud if needed        
        asset.requestContentEditingInput(with: options) { (contentEditingInput: PHContentEditingInput?, _) -> Void in
            let fullImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)
            let image = UIImage(ciImage: fullImage!)
            print(fullImage!.properties)
            for (key, value) in fullImage!.properties {
                print("key: \(key) - value: \(value)")
            }
            completion(image.jpegData(compressionQuality: 1)!)
        }
    }

, но с преобразованием CIImage в UIImage в формат данных, чтобы сохранить его локально, оно теряет все данные камеры, данные о местоположении и данные exif. Я надеюсь, что кто-то поможет мне.

1 Ответ

0 голосов
/ 22 марта 2020

После некоторого изучения этот код работает для меня, чтобы сохранить изображение (не видео) из библиотеки фотографий со всеми свойствами.

private func saveDataOfImageCI (asset:PHAsset, urlMedia: URL) {
        //For get exif data
        let options = PHContentEditingInputRequestOptions()
        options.isNetworkAccessAllowed = true //download asset metadata from iCloud if needed
        asset.requestContentEditingInput(with: options) { (contentEditingInput: PHContentEditingInput?, _) -> Void in
            let url = contentEditingInput!.fullSizeImageURL!
            let fullImage = CIImage(contentsOf: contentEditingInput!.fullSizeImageURL!)
            do {
                try CIContext().writeJPEGRepresentation(of: fullImage!,
                                                        to: urlMedia,
                                                        colorSpace: (fullImage?.colorSpace)!)
            } catch {
                print("error: \(error.localizedDescription)")
            }
            //To print properties data (exif, camera data, ....)
            for (key, value) in fullImage!.properties {
                print("key: \(key) - value: \(value)")
            }

        }
    }
...