モバイルカメラから撮影した画像のexif情報を変更する方法
私はiOSアプリケーションで画像を選択するためにUIImagePickerControllerを使用し、exif情報はinfo[UIImagePickerControllerMediaMetadata]で得ることができます。しかし、UIImageで自分のサーバーに画像をアップロードすると、exif情報のほとんどがストライプされています。 Httpリクエストで画像にexif情報を追加できるかどうかは疑問です(その後jpgとしてアップロードされた画像)。そうでない場合、どうすればこの問題を解決できますか? Make、Mod
以下は私のコードスニペットです:
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: “https://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)
“)
body.appendString(“Content-Disposition: form-data; name=”(key)”
“)
body.appendString(“(value)
“)
}
}
let filename = “test.jpg”
let mimetype = “image/jpg”
body.appendString(“–(boundary)
“)
body.appendString(“Content-Disposition: form-data; name=”(filePathKey!)”; filename=”(filename)”
“)
body.appendString(“Content-Type: (mimetype)
“)
body.appendData(imageDataKey)
body.appendString(”
“)
body.appendString(“–(boundary)–
“)
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によってUIImageからEXIFを選択せずにinfo [UIImagePickerControllerMediaTata]とNSDataからEXIF情報を取得できます。次に、変更されたEXIF情報を使用して新しいNSDictionaryを作成できます。その後、私の
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! “)
}
source