如何在iOS Swift中获取相机拍摄图片的路径

5

我使用 imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo 委托方法来获取用户在照片库选择的图像的 URL。但是当我尝试获取相机拍摄的图像的 URL 时,返回了空值。 这是我的代码。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if (imagePicker.sourceType == UIImagePickerControllerSourceType.camera) {
            let data = UIImagePNGRepresentation(pickedImage)
            UIImageWriteToSavedPhotosAlbum(pickedImage, nil, nil, nil)

            if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
                let imageURL =  info[UIImagePickerControllerReferenceURL] as? NSURL
                print(imageURL)
            }
        }
3个回答

4
您拍摄的图片还未被保存,且没有命名。在获取图片路径前需要先保存该图片。这就是为什么会返回 nil 的原因。
如果您从图库中选择一张图片而不是使用相机拍摄,您将会获得一条路径。

如果我从库中选择任何照片,它会返回路径。但是,我需要从相机拍摄照片。我尝试使用此代码保存它UIImageWriteToSavedPhotosAlbum(pickedImage, nil, nil, nil),它保存在照片库中,我可以看到它。但仍然返回nil。 - Sarath
@Sarath。你需要做的是保存你正在保存图像的路径。因此,保存路径+文件名,这样你就有了图像的路径。 - Rashwan L

1

Rashwan L Answer对我也有效,我无法使用UIImageToSavedPhotoAlbum保存图像,因此编写了CameraImageManager类方法来保存、加载和获取上传图像的URL。您还可以将其作为Image和URL的扩展。

class CameraImageManager {

   static 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)
        }

    }

    static 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
    }

   static 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
    }

}

-1

将图像保存到“照片”相册后,您可以在响应回调中获取路径。

func saveImage(image: UIImage, completion: @escaping (Error?) -> ()) {
   UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(path:didFinishSavingWithError:contextInfo:)), nil)
}

@objc private func image(path: String, didFinishSavingWithError error: NSError?, contextInfo: UnsafeMutableRawPointer?) {
    debugPrint(path) // That's the path you want
}

你能否请看一下这段代码,因为我对它感到困惑。我正在调用saveImage方法,如下所示: saveImage(image: pickedImage, completion: {_ in print("Image saved completed") } 而在didFinishSavinWithError方法中,将路径分配给变量。我遇到了崩溃问题。 - Sarath
你的程序崩溃了吗? - haik.ampardjian
2
@noir_eagle 这是崩溃信息:*** 因未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因是:'-[UIImage length]: unrecognized selector sent to instance'。 - Aryan Sharma
@noir_eagle 我也遇到了同样的崩溃 :( - Pallavi Nikumbh
当有人投入未经测试的代码时,就会导致崩溃和浪费时间。 - Omar N Shamali

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