gpt4 book ai didi

objective-c - 在 OS X 中将图像元数据 (EXIF/TIFF/IPTC) 写入图像文件

转载 作者:太空狗 更新时间:2023-10-30 03:44:31 24 4
gpt4 key购买 nike

我正在创建一个照片编辑应用程序,到目前为止,我已经成功地从图像文件中读取元数据(在得到这个问题的答案后:Reading Camera data from EXIF while opening NSImage on OS X)。

source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);

这会将图像文件的所有元数据复制到字典中,但效果不佳。但是,我找不到如何将此元数据写回新创建的 NSImage(或图像文件)。这是我保存文件的方式(其中 img 是一个 NSImage 实例没有元数据,self.cachedMetadata 是从初始图像读取的字典) :

NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
[rep setProperty:NSImageEXIFData withValue:self.cachedMetadata];
NSData *data;
if([[fileName lowercaseString] rangeOfString:@".png"].location != NSNotFound){
data = [rep representationUsingType:NSPNGFileType properties:nil];
}else if([[fileName lowercaseString] rangeOfString:@".tif"].location != NSNotFound){
data = [rep representationUsingType:NSTIFFFileType properties:nil];
}else{ //assume jpeg
data = [rep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor: [NSNumber numberWithFloat:1], NSImageEXIFData: self.cachedMetadata}];
}

[data writeToFile:fileName atomically:YES];

如何编写元数据?我曾经成功地为 JPEG 编写 EXIF(字典以前是 EXIF-only)但是因为 EXIF 缺少初始图像具有的一些字段(IPTC 和 TIFF 标签)我需要改变我的阅读方法。现在我有了所有数据,但我不知道如何将它写入新创建的图像文件。

谢谢,可以。

最佳答案

从另一个 StackOverflow 问题中找到答案:How do you overwrite image metadata? :

(代码取自该问题本身并根据我的需要进行了修改,其中包含我问题的答案)

//assuming I've already loaded the image source and read the meta
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL);
CFStringRef imageType = CGImageSourceGetType(source);

//new empty data to write the final image data to
NSMutableData *resultData = [NSMutableData data];
CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL);

//copy image data
CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)(window.cachedMetadata));
BOOL success = CGImageDestinationFinalize(imgDest);

这非常适合写回所有元数据,包括 EXIF、TIFF 和 IPTC。

关于objective-c - 在 OS X 中将图像元数据 (EXIF/TIFF/IPTC) 写入图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com