将GPS元数据字典添加到swift中使用AVFoundation拍摄的图像中



我正在尝试将GPS元数据添加到swift中使用AVFoundation拍摄的图像中。我把代码粘贴在下面,但它还不起作用。我的错误在哪里?

let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
let imgDataProvider = CGDataProviderCreateWithCFData(imageData);
let imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, nil, true, .RenderingIntentDefault)
let properties = self.getImageProperties(imageData)
let mutableDictionary: NSMutableDictionary = NSMutableDictionary(dictionary: properties)
mutableDictionary.setValue(self.getGPSDictionary(), forKey: kCGImagePropertyGPSDictionary as String)
let newImageData = CFDataCreateMutable(nil, 0)
let type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, "image/jpg" as CFString, kUTTypeImage)
let destination = CGImageDestinationCreateWithData(newImageData, (type?.takeRetainedValue())!, 1, nil)
CGImageDestinationAddImage(destination!, imageRef!, mutableDictionary)
CGImageDestinationFinalize(destination!)
let newImage = newImageData

getImageProperties方法:

private func getImageProperties(data: NSData) -> NSDictionary {
    let imageSourceRef = CGImageSourceCreateWithData(data, nil);
    let properties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef!, 0, nil)
    let props = properties
    return props!
}

getGPSDictionary方法:

private func getGPSDictionary() -> NSDictionary {
    let dictionary = [kCGImagePropertyGPSLatitude as String :"54",kCGImagePropertyGPSLongitude as String :"23"]
    return dictionary
}

是的,我知道坐标到目前为止是硬编码的,但现在重要的是让它工作,我会更新位置。

我就是这么做的。这适用于Swift 2.2 iOS 9.2

@IBAction func shutter(sender: AnyObject) {
    let connection = imageOutput.connectionWithMediaType(AVMediaTypeVideo)
    // set the orientation
    if connection.supportsVideoOrientation {
        connection.videoOrientation = currentVideoOrientation()
    }
    imageOutput.captureStillImageAsynchronouslyFromConnection(connection) {
        (sampleBuffer: CMSampleBuffer!, error: NSError!) -> Void in
        if sampleBuffer != nil {
            let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
            // get the old EXIF
            let oldEXIF = self.getEXIFFromImage(imageData)
            // add gps info to the old exif
            let newEXIF = self.addGPSToEXIF(oldEXIF, new: self.getGPSDictionaryForLocation(Genba.sharedInstance.gps.currentLocation))
            // resize the image to desired
            let resized = self.resizeNSDataImage(imageData, newSize: Genba.sharedInstance.imageSize)
            // attach the new exif to the resized image
            let attached = self.attachEXIFtoImage(resized, EXIF: newEXIF)
            // save the file to the camera roll and inside the app
            self.saveFile(attached)
        } else {
            debugPrint(self.n,#line,"Error capturing photo (error.localizedDescription)")
        }
    }
}

辅助功能在这里

// combine exif dictionaries
func addGPSToEXIF(old:NSDictionary, new:NSDictionary) -> NSDictionary {
    old.setValue(new, forKey: kCGImagePropertyGPSDictionary as String)
    return old
}
// get an NSDictionary from an image
func getEXIFFromImage(image:NSData) -> NSDictionary {
    let imageSourceRef = CGImageSourceCreateWithData(image, nil);
    let currentProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef!, 0, nil)
    let mutableDict = NSMutableDictionary(dictionary: currentProperties!)
    return mutableDict
}
// Attach EXIF DIctionary data to an image
func attachEXIFtoImage(image:NSData, EXIF:NSDictionary) -> NSData {
    let imageDataProvider:CGDataProviderRef = CGDataProviderCreateWithCFData(image)!
    let imageRef:CGImageRef = CGImageCreateWithJPEGDataProvider(imageDataProvider, nil, true, .RenderingIntentDefault)!
    let newImageData:CFMutableDataRef = CFDataCreateMutable(nil, 0)
    let type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, "image/jpg" as CFString, kUTTypeImage)
    let destination:CGImageDestinationRef = CGImageDestinationCreateWithData(newImageData, (type?.takeRetainedValue())!, 1, nil)!
    CGImageDestinationAddImage(destination, imageRef, EXIF as CFDictionaryRef)
    CGImageDestinationFinalize(destination)
    return newImageData as NSData
}
// save file within app with EXIF
func saveFile(image: NSData) {
       // Saves the file out
    let dataPath = Genba.sharedInstance.userdata_save_folder
    let fileExists = dataPath.checkResourceIsReachableAndReturnError(nil)
    if fileExists {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "Y-M-dd_HH-mm-ss"
        let time = formatter.stringFromDate(NSDate())
        let savefilepath = dataPath.URLByAppendingPathComponent(time+".jpg")
        let result =  image.writeToURL(savefilepath, atomically: false)
        if result {
            savePhotoToLibraryWithURL(savefilepath)
        } else {
            debugPrint(n,#line,"failed to save")
        }
    }
}
// resize image from NSData
func resizeNSDataImage (inputImage:NSData, newSize:CGSize) -> NSData {
    var smallerImage:NSData? = nil
    let image = UIImage(data: inputImage)
    UIGraphicsBeginImageContext(newSize)
    image!.drawInRect(CGRect(origin: CGPointZero, size: newSize))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    smallerImage = UIImageJPEGRepresentation(newImage, 1)
    return smallerImage!
} 

函数savePhotoToLibraryWithURL(图像:NSURL){

    let photoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
    photoLibrary.performChanges({
        PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(image)
    }) { (success: Bool, error: NSError?) -> Void in
        if success {
        } else {
            print(self.n,#line,"Error writing to photo library: (error!.localizedDescription)")
        }
    }
}

通过ALAssetsLibrary:保存图像

let imgDataProvider = CGDataProviderCreateWithCFData(imageData);
let imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, nil, true, .RenderingIntentDefault)
let library = ALAssetsLibrary()
library.writeImageToSavedPhotosAlbum(imageRef, metadata:mutableDictionary as [NSObject : AnyObject], completionBlock:nil)

最新更新