Сохраняйте и извлекайте фотографии со всеми их метаданными локально на iOS с помощью swift - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я делаю фотографии с пользователей iPhone, делаю их в формате JPEG, затем сохраняю их с помощью файлового менеджера, а затем сохраняю их пути с основными данными.

Как я это делаю, я не могу показывать живые изображения или позже экспортировать изображение с его предыдущими метаданными.

Мой вопрос заключается в том, как правильно сохранить изображение локально со всеми его метаданными и текущим состоянием, чтобы оно могло отображаться и экспортироваться позже, но только внутри приложения. Я не хочу, чтобы изображения были жизнеспособными вне приложения.

1 Ответ

0 голосов
/ 09 января 2019

Съемка изображения:

Взгляните на класс UIImagePickerController и используйте его для съемки. Снимки с этим НЕ сохранят изображения автоматически в галерее iOS.

Упомянутый UIImagePickerController уведомит делегата UIImagePickerControllerDelegate и вызовет функцию func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]).

Из второго параметра, информационного словаря, вы можете запросить большинство метаданных изображений, livePhoto и так далее. Необходимые ключи можно найти внутри расширения UIImagePickerController, которое называется UIImagePickerController.InfoKey.

.

Например, вот как я тогда получаю координаты изображений, если они доступны:

if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {
      let result = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil)
      if let asset = result.firstObject, let location = asset.location {
          let lat = location.coordinate.latitude
          let lon = location.coordinate.longitude
          print("Here's the lat and lon \(lat) + \(lon)")
      }
}

Сохранение изображения на телефоне в вашем приложении?:

Я использую JSONEncoder. Вы можете использовать этот класс для кодирования, а затем снова декодировать свой пользовательский класс изображений.

Ваш пользовательский класс изображений, который имеет UIImage и все другие свойства, должен затем реализовывать протокол Codable. Затем с помощью JSONEncoder создайте Data объекта с помощью метода encode() и сохраните его в частном месте приложения с помощью FileManager. Позже вы можете снова прочитать все файлы из этого места с помощью FileManager, decode() с JSONEncoder, и вуаля, у вас снова будут все ваши изображения в виде вашего пользовательского класса изображений.

Сохранение изображения в галерее пользователей «Экспорт»:

Вот пример того, как я снова сохраняю это изображение в галерее пользователей как способ его экспорта:

private static func saveImageToGallery(picture: UIImage, lat: Double?, lon: Double?) {
            PHPhotoLibrary.shared().performChanges({
                let request = PHAssetCreationRequest.creationRequestForAsset(from: picture)
                if let _lat = lat, let _lon = lon {
                    request.location = CLLocation(latitude: _lat, longitude: _lon)
                }
            })
        }

Надеюсь, этого будет достаточно, чтобы направить вас на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...