如何在Swift 4中将自定义值检索到图像元数据?

时间:2018-07-19 08:59:18

标签: ios iphone swift uiimagepickercontroller

正在为图像共享相关内容创建应用程序。在这里,我的要求是我必须将一些自定义信息(名称,电话号码,价格)存储到图像元数据中,并将其取回

我使用UIImagePickerController捕获图像并将信息设置到UIImagePickerControllerDelegate中的图像元数据中,如下所述:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.dismiss(animated: true, completion: nil)
    let profileImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    let imageData: Data = UIImageJPEGRepresentation(profileImage!, 1)!
    let cgImgSource: CGImageSource = CGImageSourceCreateWithData(imageData as CFData, nil)!
    let uti: CFString = CGImageSourceGetType(cgImgSource)!
    let dataWithExif: NSMutableData = NSMutableData(data: imageData)
    let destination: CGImageDestination = CGImageDestinationCreateWithData((dataWithExif as CFMutableData), uti, 1, nil)!
    let imageProoperties = CGImageSourceCopyPropertiesAtIndex(cgImgSource, 0, nil)! as NSDictionary
    let mutable: NSMutableDictionary = imageProoperties.mutableCopy() as! NSMutableDictionary

    let EXIFDictionary: NSMutableDictionary = (mutable[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary)!
    print("Before Modification: \(EXIFDictionary)")
    EXIFDictionary[kCGImagePropertyExifUserComment as String] = "\(self.m_NameTxtFd.text!):\(self.m_PhoneNumberTxtFd.text!):\(self.m_PriceTxtFd.text!)"
    mutable[kCGImagePropertyExifDictionary as String] = EXIFDictionary

    CGImageDestinationAddImageFromSource(destination, cgImgSource, 0, (mutable as CFDictionary))
    CGImageDestinationFinalize(destination)

    let testImage: CIImage = CIImage(data: dataWithExif as Data, options: nil)!
    let newProperties: NSDictionary = testImage.properties as NSDictionary
    print("After Modification : \(newProperties)") //Here I Got My Information is Stored Successfully

    self.m_ImgView.image = self.convert(cmage: testImage)
    self.saveImageDocumentDirectory()
}

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

现在要像下面提到的那样将图像保存在NSDocumentDirectory中:

func saveImageDocumentDirectory(){
        let fileManager = FileManager.default
        let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("apple.jpg")
        let image = self.m_ImgView.image
        print(paths)
        let imageData = UIImageJPEGRepresentation(image!, 0.5)
        fileManager.createFile(atPath: paths as String, contents: imageData, attributes: nil)
    }

现在将要在另一个如下所述的视图控制器中获取存储的图像:

func getImage(){
        let fileManager = FileManager.default
        let imagePAth = (self.getDirectoryPath() as NSString).appendingPathComponent("apple.jpg")
        print(imagePAth)
        if fileManager.fileExists(atPath: imagePAth){
            self.m_ImgView.image = UIImage(contentsOfFile: imagePAth)
            self.fetchImageDetails()
        }else{
            print("No Image")
        }
    }

我成功获取了图像,现在必须从图像元数据中获取信息,如下所述:

func fetchImageDetails() {
        let profileImage = self.m_ImgView.image!
        let ciImage: CIImage = CIImage(cgImage: profileImage.cgImage!)
        let newProperties: NSDictionary = ciImage.properties as NSDictionary
    }

但是问题是图像属性中的信息为空。

请指导我从存储的图像中检索自定义信息。

2 个答案:

答案 0 :(得分:2)

首先创建NSMutableDictionary并将其值设置为NSMutableDictionary,然后将其设置为,则无需再次设置直接分配给NSMutableDictionary到Metada的元数据。

exeSvc.awaitTermination(5, TimeUnit.SECONDS); //this will 5 second to finish all tasks
exeSvc.shutdown();

答案 1 :(得分:0)

let  currentImage = sender.view as! UIImageView