在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage

Posted

技术标签:

【中文标题】在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage【英文标题】:Set EXIF data to a NSImage in Swift, Cocoa, Mac OSX 【发布时间】:2015-07-29 16:48:47 【问题描述】:

如果图像没有 EXIF 数据,我正在尝试将 EXIF 数据设置为 NSImage。其实我只想设置 DateTimeOriginal。但是我的方法不起作用。

let completePath = "/Users/stefocdp/image.jpg"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
let folderAttributes: NSDictionary = NSFileManager.defaultManager().attributesOfItemAtPath(completePath, error: nil)!
var dateString: String = dateFormatter.stringFromDate(folderAttributes.objectForKey(NSFileCreationDate) as! NSDate)

for obj in self.image.representations 
    if let rep = obj as? NSBitmapImageRep 
        if rep.valueForProperty(NSImageEXIFData) != nil 
            //will be called if the image has exif data

            // get exif dictonary
            var exifData = rep.valueForProperty(NSImageEXIFData) as! NSDictionary

            //convert CFString to String
            var cfStr:CFString = kCGImagePropertyExifDateTimeOriginal
            var nsTypeString = cfStr as NSString
            var keySwiftString:String = nsTypeString as String

            //get date from exif data
            dateString = exifData.valueForKey(keySwiftString) as! String

            //convert the date to NSDate
            var dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
            var date = dateFormatter.dateFromString(dateString)

            //convert the NSDate back to String (only because I want another date format)
            dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
            dateString = dateFormatter.stringFromDate(date!)
         else 
            //will be called if the image don't has exif data

            //create dictionary for the exif data
            var exifData = Dictionary<String, CFString>()

            //convert the given date string to NSDate
            var dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
            var date = dateFormatter.dateFromString(dateString)

            //convert it back to String (different date format for exif data)
            dateFormatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
            dateString = dateFormatter.stringFromDate(date!)

            //convert CFString to String
            var cfStr:CFString = kCGImagePropertyExifDateTimeOriginal
            var nsTypeString = cfStr as NSString
            var keySwiftString:String = nsTypeString as String

            //add date to the exifData dictionary
            exifData[keySwiftString] = dateString as CFString

            //set the exifData to the NSBitmapImageRep
            rep.setProperty(NSImageEXIFData, withValue: exifData)

            //add the NSBitmapImageRep to the image
            self.image.addRepresentation(rep)
        
    
    else 
        //is not an instance of NSBitmapImageRep
    

如果图像有 exif 数据,我只需从中获取 DateTimeOriginal 并将其存储在名为“dateString”的字符串变量中。但如果它没有 exif 数据(在“其他”情况下),我正在创建一个存储日期的字典。然后我将 exif 数据添加到 NSBitmapImageRep。最后我想把这个 imagerep 添加到图像中。我想最后一步是问题所在。

谁能帮我解决我的问题?

谢谢!

【问题讨论】:

你可能想看看here 【参考方案1】:

//可以使用CGImageSourceRef代替NSBitMapImageRef。对于初学者:

let url = NSURL(fileURLWithPath: imgfile) //imgfile = a String of the img file path

let cgiSrc = CGImageSourceCreateWithURL(url,nil)

let cfD:CFDictionaryRef = CGImageSourceCopyPropertiesAtIndex(cgiSrc!, 0, nil)!

let nsDic = NSDictionary(dictionary: cfD)

print(nsDic.description) //verify that it's working

【讨论】:

有趣。但是关于设置的问题不是像日期这样的EXIF值吗?您的答案仅获取值。它如何与 OP 的代码一起使用?我很好奇。 我发现 NSBitMapImageRep 对我不起作用,这可能是问题所在。 从 NSBitMapImageRep 然后从 CGImageSourceRef 创建字典,然后比较每个的 print(dic.description),显示格式非常不同的输出。

以上是关于在 Swift、Cocoa、Mac OSX 中将 EXIF 数据设置为 NSImage的主要内容,如果未能解决你的问题,请参考以下文章

Objective C - 创建 PDF (Mac OSX / Cocoa)

在 Cocoa Mac OSX 中设置 FirstResponder 的问题

使用 PDFOutline 在 Swift/Cocoa 中将 TOC 添加到 PDFDocument

如何在 Swift(Cocoa 应用程序)中将数据传递给以前的 ViewController

了解应用程序在 cocoa mac OSX 中是不是处于非活动状态的最佳方法?

如何使用 Cocoa (Mac) 在 Swift 中创建 PDF