Swift 4 didFinishPickingMediaWithInfo保存图像

3

我正在使用UIImagePickerController来使用我的相机,代码如下:

@objc func toggle() {
        if UIImagePickerController.isSourceTypeAvailable(.camera) {

            //Define UIImagePickerController variable

            let imagePicker = UIImagePickerController()

            //Assign the delegate

            imagePicker.delegate = self

            //Set image picker source type

            imagePicker.sourceType = .camera

            //Allow Photo Editing

            imagePicker.allowsEditing = true

            //Present camera

            UIApplication.topViewController()?.present(imagePicker, animated: true, completion: nil)
        }
    }

现在我正在尝试捕获使用didFinishPickingMediaWithInfo方法拍摄的图像,我在网上找到了这个示例:

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

        let imageUrl          = info[UIImagePickerControllerOriginalImage] as! NSURL
        let imageName         = imageUrl.lastPathComponent
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let photoURL          = NSURL(fileURLWithPath: documentDirectory)
        let localPath         = photoURL.appendingPathComponent(imageName!)
        let image             = info[UIImagePickerControllerOriginalImage]as! UIImage
        let data              = UIImagePNGRepresentation(image)

        do
        {
            try data?.write(to: localPath!, options: Data.WritingOptions.atomic)
        }
        catch
        {
            // Catch exception here and act accordingly
        }

        UIApplication.topViewController()?.dismiss(animated: true, completion: nil);
    }

我将UIImagePickerControllerReferenceURL更改为UIImagePickerControllerOriginalImage,因为UIImagePickerControllerReferenceURL为nil。但是在我更改后,我遇到了以下致命错误:

无法将类型为“UIImage”(0x1b6b02b58)的值转换为“NSURL”

我该如何保存从相机拍摄的图像?我做错了什么?

2个回答

6

按照以下方式编写代码,这将为您提供图像。

let image = info[UIImagePickerControllerOriginalImage] as! UIImage

UIImagePickerControllerOriginalImage返回图像而不是NSURL

在iOS 11中,编写以下代码以获取图像url。从iOS 11开始,UIImagePickerControllerImageURL可用,早期使用UIImagePickerControllerMediaURL键获取图像url。

if #available(iOS 11.0, *) {
    if let imageURL = info[UIImagePickerControllerImageURL] as? URL {
        print(imageURL)
    }
} else {
    if let imageUrl = info[UIImagePickerControllerMediaURL] as? URL {
        print(imageUrl)
    }
}

希望这能对您有所帮助。


@user979331,我已经更新了我的答案。请查看。 - Sagar Chauhan
UIImagePickerControllerImageURL 不是 info 中的一个键。 - user979331
如果您使用的是早于iOS 11的版本,则需要使用UIImagePickerControllerMediaURL键。请参见最终编辑的答案。 - Sagar Chauhan
1
UIImagePickerControllerMediaURL 也不是一个关键字 :( - user979331
如果您尚未添加访问照片库的权限密钥,则需要添加它。 - Sagar Chauhan
显示剩余6条评论

3

那些正在寻找完整的实现方法,以适用于 Swift 4.2+ 的人。

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

    if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
        imageView.image = pickedImage
    }

    imgPicker.dismiss(animated: true, completion: nil)
}

这将根据新的语法为您返回原始图像

对于图像URL媒体URL,请使用相应的

let imgURL = info[UIImagePickerController.InfoKey.imageURL]
let mediaURL = info[UIImagePickerController.InfoKey.mediaURL]

1
这是针对Swift 4.2+的。 - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接