如何从使用Camera拍摄的UIImagePickerController获取图像名称

时间:2017-02-03 13:13:47

标签: ios swift uiimagepickercontroller

以下代码适用于从图库中挑选的图像。但如果使用相机拍摄则不起作用。我试图将图像保存到存储中并再次读取,但我无法做到这一点。那么任何人都可以帮助我吗?谢谢。

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


    if let referenceUrl = info[UIImagePickerControllerReferenceURL] as? NSURL, image = info[UIImagePickerControllerOriginalImage] as? UIImage  {
            let phAsset = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl], options: nil).lastObject as! PHAsset
            PHImageManager.defaultManager().requestImageDataForAsset(phAsset, options: PHImageRequestOptions(), resultHandler: { (imagedata, dataUTI, orientation, info) in
                if info!.keys.contains(NSString(string: "PHImageFileURLKey")) {
                    let path = info![NSString(string: "PHImageFileURLKey")] as! NSURL
                    print("path q\(path)")

                    self.mImageUrl = path
                    self.mlocalPath = path.path
                    self.mImageExtension = path.pathExtension
                    self.mImageName = path.lastPathComponent!
                    print("mImageName q\(self.mImageName)")
                }

            })
    }

    dismissViewControllerAnimated(true, completion: nil)

}

3 个答案:

答案 0 :(得分:2)

快速5 +

由于前面的答案很丰富,因此图像尚未存储在图库中,因此没有imageName。您需要将其存储在图库中。使用下面的Helper类可以从FileManager保存并获取图像。

感谢此Answer

class CameraImageManager {
    
    static let shared = CameraImageManager()

   public func saveImage(imageName: String, image: UIImage) {

        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

        let fileName = imageName
        let fileURL = documentsDirectory.appendingPathComponent(fileName)
        guard let data = image.jpegData(compressionQuality: 1) else { return }

        //Checks if file exists, removes it if so.
        if FileManager.default.fileExists(atPath: fileURL.path) {
            do {
                try FileManager.default.removeItem(atPath: fileURL.path)
                print("Removed old image")
            } catch let removeError {
                print("couldn't remove file at path", removeError)
            }

        }

        do {
            try data.write(to: fileURL)
        } catch let error {
            print("error saving file with error", error)
        }

    }

    public func getImagePathFromDiskWith(fileName: String) -> URL? {

        let documentDirectory = FileManager.SearchPathDirectory.documentDirectory

        let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
        let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)

        if let dirPath = paths.first {
            let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)
            return imageUrl
        }

        return nil
    }

   public func loadImageFromDiskWith(fileName: String) -> UIImage? {

        let documentDirectory = FileManager.SearchPathDirectory.documentDirectory

        let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
        let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)

        if let dirPath = paths.first {
            let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)
            let image = UIImage(contentsOfFile: imageUrl.path)
            return image

        }

        return nil
    }

}

现在,在imagePickerController didFinishPickingMediaWithInfo回调函数中,这是为图像分配名称并保存它的方法。

public func imagePickerController(_ picker: UIImagePickerController,
                                  didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
    guard let image = info[.editedImage] as? UIImage else { return }
    let imageName = "RDV_" + UUID().uuidString
    CameraImageManager.shared.saveImage(imageName: imageName, image: image)
    print("IMAGE NAME IS: ", imageName)
}

希望有帮助。

答案 1 :(得分:0)

您可以像这样使用addObserver通知

ViewController A:您想要更改图像的位置,请在viewDidLoad

中添加
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.methodOfImageChange(_:)), name:"ImageChanged", object: nil)

在ViewController A中添加此方法

func methodOfImageChange(notification: NSNotification){
    let appStatus = notification.userInfo as? Dictionary<String,AnyObject>   
    // appStatus contains your image in "image" key 
   }

现在在didFinishPickingMediaWithInfo中添加此

let dictionary: [String:AnyObject] = [
        "image" : (info[UIImagePickerControllerOriginalImage] as? UIImage)!,
        ]
    NSNotificationCenter.defaultCenter().postNotificationName("ImageChanged", object: self, userInfo: dictionary)

    picker .dismissViewControllerAnimated(true, completion: nil)

希望这有帮助

答案 2 :(得分:0)

图片尚未出现在图库中,因此我认为您没有名字。

在我的应用程序中,流程(通过导航控制器)是:

  • 选择VC(选择相机或照片库) - &gt;
  • UIImagePickerController - &gt;
  • 编辑VC(使用后退导航和操作按钮 - 其中包括 - 保存到照片库)

如果用户选择相机,他们会拍照并且选项为“重拍”或“使用照片”。他们选择“使用照片”,他们在编辑VC中。

如果他们选择返回选择VC,则无法找到图像。