Загрузить UIImage из изображения PHAsset absoluteString Swift 4 - PullRequest
0 голосов
/ 16 октября 2018

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

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

file:///Users/admin/Library/Developer/CoreSimulator/Devices/B31CE61D-FB46-41F0-B254-B66B9335E1E4/data/Media/DCIM/100APPLE/IMG_0005.JPG

Но когда я пытаюсь загрузить изображение,

   if let image = UIImage(named: filepath) {
        imageView.image = image
   } 

Не загружается.

Как мнезагрузить изображение из пути к файлу?

Код, который я использую для получения пути к файлу

func getURL(ofPhotoWith mPhasset: PHAsset, completionHandler : @escaping ((_ responseURL : URL?) -> Void)) {
    let options = PHContentEditingInputRequestOptions()
    options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
        return true
    }
    mPhasset.requestContentEditingInput(with: options, completionHandler: { (contentEditingInput, info) in
        completionHandler(contentEditingInput!.fullSizeImageURL)
    })
}


func add(images: [PHAsset])  {
    for image in images {
        getURL(ofPhotoWith: image) { (imgURL) in
            if let imgURL = imgURL {
                print ("ImageURL: \(imgURL.absoluteString)")
            }
        }
     }
 }

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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

Не делайтет.Чтобы сэкономить, чтобы вы могли извлечь что-то из камеры в более позднее время, это PHAsset localIdentifier.Вы можете использовать это для получения того же актива позже, и теперь вы можете запросить соответствующее изображение.

0 голосов
/ 17 октября 2018

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

PHContentEditingInput - неправильный инструмент для этой работы.Как следует из названия этого класса и функций, которые вы используете для его получения, он предназначен для редактирования контента - таких задач, как применение фильтра к ресурсу в библиотеке.

Когда PHContentEditingInput дает вам URL-адрес файла, он предоставляет вам временный доступ к этому файлу.PhotoKit не гарантирует, что данный ресурс всегда будет поддерживаться файлом по этому URL, и даже если это так, PhotoKit аннулирует временный доступ к этому URL, когда освобождается PHContentEditingInput.

ПользовательБиблиотека фотографий не является каталогом, полным файлов изображений - это база данных , где каждый ресурс может иметь ресурсы данных, хранящиеся в одном или нескольких файлах, которые могут быть, а могут и не находиться в локальном хранилище постоянно.Если вы хотите загрузить ресурсы во внешнюю службу и сохранить все исходные данные, вам нужен API, предназначенный для получения ресурсов данных.Для этого PhotoKit предлагает два варианта:

  1. Если вы хотите просто некоторое представление изображения текущего состояния актива, используйте PHImageManager.Это загружает и / или генерирует данные изображения, готовые для сохранения в виде файла, включая все изменения, которые пользователь уже применил к активу:

    let options = PHImageRequestOptions()
    options.deliveryMode = .highQualityFormat
    options.isNetworkAccessAllowed = true
    PHImageManager.default().requestImageData(for: myAsset, options: options) { data, uti, orientation, info in
        // save `data` to file / upload to web service
        // use `uti` to find out what file type it is
    }
    
  2. Если вы хотите оригинальные ресурсы данных изображений - то есть достаточно данных для резервного копирования и восстановления ресурса, включая такие функции, как текущее редактирование, режимы Live Photo и данные изображений в формате RAW - используйте PHAssetResource и PHAssetResourceManager:

    let resources = PHAssetResource.resources(for: myAsset)
    let options = PHAssetResourceRequestOptions()
    options.isNetworkAccessAllowed = true
    for resource in resources {
        let outputURL = myOutputDirectory.appendingPathComponent(resource.originalFilename)
        PHAssetResourceManager.default().writeData(for: resource, to: outputURL, options: options) { error in
            // handle error if not nil
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...