Swift如何修改从移动相机拍摄的图像中的exif信息

华丽的

我曾经UIImagePickerController在我的iOS应用程序中选择图像,我知道exif信息可以通过获取info[UIImagePickerControllerMediaMetadata]但是,当我通过上载我的图像到服务器时UIImage,大多数exif信息已被分割。我想知道是否可以在Http请求中将exif信息添加到我的图像中(此后以jpg格式上传的图像)。如果没有,我应该如何解决这个问题?我想更改“制作”,“模型”属性(换句话说,使用什么设备拍摄这张照片)

以下是我的代码段:

func Tapped() {
    let myPickerController = UIImagePickerController()

    myPickerController.delegate = self
    myPickerController.sourceType = UIImagePickerControllerSourceType.Camera
    myPickerController.allowsEditing = false
    self.presentViewController(myPickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    let image = info[UIImagePickerControllerOriginalImage] as? UIImage
    myImageView.image = image
    UIImageWriteToSavedPhotosAlbum(image!, self, #selector(ViewController.image(_:didFinishSavingWithError:contextInfo:)), nil)
    self.dismissViewControllerAnimated(true, completion: nil)
}

func myImageUploadRequest()
{

    let myUrl = NSURL(string: "http://XXXXXX/Uploadfile")

    let request = NSMutableURLRequest(URL:myUrl!)
    request.HTTPMethod = "POST"

    let param = [
        "userId"    : "7"
    ]

    let boundary = generateBoundaryString()

    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


    let imageData = UIImageJPEGRepresentation(myImageView.image!, 1)

    if(imageData == nil)  { return; }

    request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", imageDataKey: imageData!, boundary: boundary)



    myActivityIndicator.startAnimating()

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        // You can print out response object
        print("******* response = \(response)")

        // Print out response body
        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("****** response data = \(responseString!)")

        do{
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

        }catch{
            print(error)
        }


        dispatch_async(dispatch_get_main_queue(),{
            self.myActivityIndicator.stopAnimating()
            self.myImageView.image = nil
        })

    }

    task.resume()
}

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
    let body = NSMutableData();

    if parameters != nil {
        for (key, value) in parameters! {
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString("\(value)\r\n")
        }
    }

    let filename = "test.jpg"

    let mimetype = "image/jpg"

    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
    body.appendString("Content-Type: \(mimetype)\r\n\r\n")
    body.appendData(imageDataKey)
    body.appendString("\r\n")



    body.appendString("--\(boundary)--\r\n")

    return body
}

func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().UUIDString)"
}

extension NSMutableData {
    func appendString(string: String) {
        let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
        appendData(data!)
    }
}
华丽的

是的!最后,我做了一个技巧来修改EXIF信息。首先,您可以通过UIImageJPEGRepresentation从info [UIImagePickerControllerMediaMetadata]和NSData中获取EXIF信息,而无需从EXImage中获取NSData。然后,您可以使用修改后的EXIF信息创建一个新的NSDictionary。之后,在下面调用我的函数,即可使用修改后的EXIF获取图像NSData!

func saveImageWithImageData(data: NSData, properties: NSDictionary, completion: (data: NSData, path: NSURL) -> Void) {

    let imageRef: CGImageSourceRef = CGImageSourceCreateWithData((data as CFDataRef), nil)!
    let uti: CFString = CGImageSourceGetType(imageRef)!
    let dataWithEXIF: NSMutableData = NSMutableData(data: data)
    let destination: CGImageDestinationRef = CGImageDestinationCreateWithData((dataWithEXIF as CFMutableDataRef), uti, 1, nil)!

    CGImageDestinationAddImageFromSource(destination, imageRef, 0, (properties as CFDictionaryRef))
    CGImageDestinationFinalize(destination)

    var paths: [AnyObject] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let savePath: String = paths[0].stringByAppendingPathComponent("exif.jpg")

    let manager: NSFileManager = NSFileManager.defaultManager()
    manager.createFileAtPath(savePath, contents: dataWithEXIF, attributes: nil)

    completion(data: dataWithEXIF,path: NSURL(string: savePath)!)

    print("image with EXIF info converting to NSData: Done! Ready to upload! ")

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我想在Android中读取图片中的exif信息。我可以从图库中的图像读取exif,但无法读取从相机拍摄的exif照片

来自分类Dev

如何在树莓派中设置相机以拍摄黑白图像?

来自分类Dev

如何添加EXIF信息以在.NET中对图像进行地理标记?

来自分类Dev

如何确定图库中的图像是从相机中以纵向还是横向拍摄的

来自分类Dev

如何在Android中手动保存图像(使用相机拍摄)

来自分类Dev

如何使用命令行在Exif中更改相机信息

来自分类Dev

如何告诉默认设备相机应用不要拍摄最大的图像,而是拍摄较小的图像?

来自分类Dev

如何告诉默认设备相机应用不要拍摄最大的图像,而是拍摄较小的图像?

来自分类Dev

如何在相机拍摄的图像上添加相框并保存

来自分类Dev

如何将以相机意图拍摄的图像设置为ImageView?

来自分类Dev

如何显示用户刚用相机拍摄的图像

来自分类Dev

如何立即在屏幕上显示从相机拍摄的图像?

来自分类Dev

Python:从图像中删除Exif信息

来自分类Dev

Python:从图像中删除Exif信息

来自分类Dev

放入从相机或自己的相机拍摄的帧图像

来自分类Dev

在相机胶卷中获取特定图像/照片的EXIF数据

来自分类Dev

IOS 如何在不按拍摄按钮的情况下以编程方式从 iPhone 相机场景中获取图像?

来自分类Dev

如何从目录中的所有图像中递归去除exif信息?

来自分类Dev

如何在iOS中修改图像元数据(EXIF)而不进行复制?

来自分类Dev

如何在iOS中修改图像元数据(EXIF)而不进行复制?

来自分类Dev

如何在iOS中读取图像的完整exif和tiff信息

来自分类Dev

如何调整从图库中拍摄的图像的大小?

来自分类Dev

在使用OpenCV4Android的应用程序中,如何确定相机是在拍摄8位图像还是32位图像?

来自分类Dev

试图显示从相机意图拍摄的图像

来自分类Dev

Android用相机拍摄多个图像

来自分类Dev

将从相机拍摄的图像设置为ImageView

来自分类Dev

不使用位图裁剪相机拍摄的图像

来自分类Dev

拍摄图像时在相机上绘制文字

来自分类Dev

使用相机会话拍摄的裁剪图像

Related 相关文章

  1. 1

    我想在Android中读取图片中的exif信息。我可以从图库中的图像读取exif,但无法读取从相机拍摄的exif照片

  2. 2

    如何在树莓派中设置相机以拍摄黑白图像?

  3. 3

    如何添加EXIF信息以在.NET中对图像进行地理标记?

  4. 4

    如何确定图库中的图像是从相机中以纵向还是横向拍摄的

  5. 5

    如何在Android中手动保存图像(使用相机拍摄)

  6. 6

    如何使用命令行在Exif中更改相机信息

  7. 7

    如何告诉默认设备相机应用不要拍摄最大的图像,而是拍摄较小的图像?

  8. 8

    如何告诉默认设备相机应用不要拍摄最大的图像,而是拍摄较小的图像?

  9. 9

    如何在相机拍摄的图像上添加相框并保存

  10. 10

    如何将以相机意图拍摄的图像设置为ImageView?

  11. 11

    如何显示用户刚用相机拍摄的图像

  12. 12

    如何立即在屏幕上显示从相机拍摄的图像?

  13. 13

    Python:从图像中删除Exif信息

  14. 14

    Python:从图像中删除Exif信息

  15. 15

    放入从相机或自己的相机拍摄的帧图像

  16. 16

    在相机胶卷中获取特定图像/照片的EXIF数据

  17. 17

    IOS 如何在不按拍摄按钮的情况下以编程方式从 iPhone 相机场景中获取图像?

  18. 18

    如何从目录中的所有图像中递归去除exif信息?

  19. 19

    如何在iOS中修改图像元数据(EXIF)而不进行复制?

  20. 20

    如何在iOS中修改图像元数据(EXIF)而不进行复制?

  21. 21

    如何在iOS中读取图像的完整exif和tiff信息

  22. 22

    如何调整从图库中拍摄的图像的大小?

  23. 23

    在使用OpenCV4Android的应用程序中,如何确定相机是在拍摄8位图像还是32位图像?

  24. 24

    试图显示从相机意图拍摄的图像

  25. 25

    Android用相机拍摄多个图像

  26. 26

    将从相机拍摄的图像设置为ImageView

  27. 27

    不使用位图裁剪相机拍摄的图像

  28. 28

    拍摄图像时在相机上绘制文字

  29. 29

    使用相机会话拍摄的裁剪图像

热门标签

归档