簡體   English   中英

如何從使用相機拍攝的 UIImagePickerController 中獲取圖像名稱

[英]How to get image name from UIImagePickerController taken with Camera

下面的代碼非常適合從圖庫中挑選的圖像。 但如果用相機拍攝將不起作用。 我試圖將圖像保存到存儲器中並再次讀取,但我無法做到這一點。 那么有人可以幫助我嗎? 謝謝你。

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)

}

斯威夫特 5+

正如前面的答案所暗示的那樣,圖像尚未存儲在圖庫中,因此沒有imageName 您需要將其存儲在圖庫中。 使用下面的 Helper 類從FileManager保存和獲取圖像。

感謝這個答案

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

希望能幫助到你。

您可以像這樣使用帶有 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)

希望這可以幫助

圖片還沒有在圖庫中,所以我不相信你有名字。

在我的應用程序中,流程(通過導航控制器)是:

  • 選擇 VC(選擇相機或照片庫)->
  • UIImagePickerController ->
  • 編輯 VC(帶有后退導航和操作按鈕,用於保存到照片庫)

如果用戶選擇相機,他們會拍照,選項是“重拍”或“使用照片”。 如果他們選擇“使用照片”,他們就在編輯 VC 中。

如果他們隨后選擇返回到 Select VC,則無法找到該圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM