Доступ к файлам изображений на рулоне камеры (iOS 12.1.4, Swift 4.2, Xcode 10.1) - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь вычислить хэш файла для JPEG файлов (например, MD5) после съемки со встроенной камерой.Я могу создать дайджест по данным изображения, но это будет не то же самое, что хеш файла.Глядя на модуль Photo и его класс PHAsset, я не вижу способа получить фактический путь к файлу (URL), который я мог бы затем передать MD5Digest.Возможно, можно захватить файл URL сразу после сохранения изображения в рулон фотокамеры, реализовав функцию прослушивания завершения.Кто-нибудь пробовал это раньше?

Обновлен код с завершением, но мне все еще нужно найти URL.

 @IBOutlet weak var imageHash: UILabel!

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    let orgPic = info[UIImagePickerController.InfoKey.originalImage] as? UIImage

    UIImageWriteToSavedPhotosAlbum(orgPic!, self, #selector(imageSaved(_:didFinishSavingWithError:contextInfo:)), nil)

}

@objc func imageSaved(_ img: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
        if let error = error {
            // we got back an error!
            let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default))
            present(ac, animated: true)
        } else {
            let ac = UIAlertController(title: "Saved!", message: "\(img.ciImage?.url)", preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default))
            present(ac, animated: true)
        }
 }

// the img.ciImage.url is "nil" unfortunately

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Несмотря на то, что опубликованный код Ajinkya Sharma работал, я заметил, что при сохранении createRequestForAsset производительность по сохранению изображений в кадре камеры была значительно ниже по сравнению с UIImageWriteToSavedPhotosAlbum.Поэтому я выбрал гибридное решение.Я сохранил, используя старую функцию, затем использовал среду PHAsset, чтобы получить самый новый файл изображения и получить его URL.Проблема решена.

public func saveImgToLocal(_ img: UIImage) {
    // significantly faster than creationRequestForAsset
    UIImageWriteToSavedPhotosAlbum(img, self, #selector(imageSaved(_:didFinishSavingWithError:contextInfo:)), nil)
}

@objc func imageSaved(_ img: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
    if let error = error {
        // we got back an error!
        let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
        ac.addAction(UIAlertAction(title: "OK", style: .default))
        present(ac, animated: true)
    } else {
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        fetchOptions.fetchLimit = 1
        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
        if let asset = fetchResult.firstObject
        {
            self.imageHash.text = getAsset(asset: asset)
        }
    }
}

func getAsset(asset: PHAsset) -> String {
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    var hashString = "" as String
    option.isSynchronous = true
    manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info) -> Void in
        let url = info!["PHImageFileURLKey"] as! NSURL
        do {
            let data = try Data(contentsOf: url as URL)
            hashString = data.md5.rawValue
        }
        catch {
            hashString = "Error computing hash"
        }
    })
    return hashString
}
0 голосов
/ 06 марта 2019

Итак, ваш главный девиз - сравнивать MD5s из 2-х файлов изображений.Итак, вот что я попробовал, и, возможно, это поможет вам

; TLDR - файл, сохраненный в библиотеке, и сам файл не соответствуют мне

 public func saveImgToLocal(_ img: UIImage,
                           onComplete: @escaping () -> Void) {

    var blockPlaceholder: PHObjectPlaceholder?
    var changeRequest: PHAssetChangeRequest?

    PHPhotoLibrary.shared().performChanges({
        changeRequest =  PHAssetChangeRequest.creationRequestForAsset(from: img)
        blockPlaceholder = changeRequest?.placeholderForCreatedAsset
    }, completionHandler: { (saved, error) in
        //_saved_ is of type bool, you can use it to check whether image is saved
        //Here we would fetch the asset using our saved placeholder
        let fetchOptions = PHFetchOptions()
        let fetchResult:PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [blockPlaceholder!.localIdentifier], options: fetchOptions)
        if let asset = fetchResult.firstObject {
            //Method to convert asset to Actual image
            self.getAsset(asset: asset)
        }
        onComplete()

    })
}

Вот как я сохранилизображение в Local

Вот как я получил изображение из Local

func getAsset(asset: PHAsset)  {
    let manager = PHImageManager.default()
    let option = PHImageRequestOptions()
    var resultImage = UIImage()
    option.isSynchronous = true
    manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
        resultImage = result!
        let url = info!["PHImageFileURLKey"] as! NSURL
        //Image created using the file URL.
        let image = UIImage.init(contentsOfFile: url.path!)
//I even compared the resultImage instead of the image from the file
        if UIImagePNGRepresentation(image!) == UIImagePNGRepresentation(self.image!) {
            print("Same image")
        }
    })

}

Так что, если вы просто хотите вернуть сохраненное изображение, это можно сделать, но я не уверенсохранено ли изображение в Библиотеке фотографий.HTH: -)

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