在 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