将图像元数据 (EXIF/TIFF/IPTC) 写入 OS X 中的图像文件

2023-11-27

我正在创建一个照片编辑应用程序,到目前为止,我已经成功地从图像文件中读取元数据(在得到这个问题的答案后:在 OS X 上打开 NSImage 时从 EXIF 读取相机数据).

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

这会将图像文件的所有元数据复制到字典中,但效果不佳。但是,我不知道如何将此元数据写回新创建的NSImage(或图像文件)。这是我保存文件的方法(其中img是一个 NSImage 实例without元数据和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),但由于 EXIF 缺少初始图像所具有的一些字段(IPTC 和 TIFF 标签),我需要更改我的读取方法。现在我有了所有数据,但我不知道如何将其写入新创建的图像文件。

谢谢, 能。


从另一个 StackOverflow 问题中找到答案:如何覆盖图像元数据?:

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

//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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将图像元数据 (EXIF/TIFF/IPTC) 写入 OS X 中的图像文件 的相关文章

随机推荐

  • Android EPUBLIB 读取/加载内容

    我正在玩http www siegmann nl epublib在安卓上 有人可以解释一下正确的方法吗 阅读 epub HTML 内容 如何在 Android 上显示它 使用 WebView 如何将内容拆分为页面以及 如何搜索内容 Thx
  • 为什么断言只是终止为 iPhone 编译的程序?

    我正在调试一个经过大量断言 处理的 iPhone 应用程序 Xcode Objective C 和设备模拟器 在某些情况下 断言失败只会终止应用程序 而不是像我期望的那样闯入调试器 我通过实现我自己的断言来解决方法 其效果是 define
  • jshell 中 J 和 R 标志的确切含义/用途是什么?

    从帮助信息来看 J
  • Google Recaptcha v3 示例演示

    到目前为止 我一直在使用 Google Recaptcha v2 但现在我想使用最新版本 v3 更新我的 WebApp 是否有人可以为基本表单添加一个完整工作的 Google Recaptcha v3 示例 因为我找不到它的任何工作演示 我
  • 在逻辑删除后恢复 LongListSelector 中的滚动位置

    我正在尝试使用 WP7 Silverlight 工具包中的 LongListSelector 控件 这需要一些工作 但我终于让它与我的应用程序一起工作 不幸的是 我在正确处理逻辑删除过程时遇到了一些麻烦 当应用程序逻辑删除 或用户通过选择列
  • 如何在C#.NET中获得准确的下载/上传速度?

    我想使用 C NET 通过网络接口获得准确的下载 上传速度 我知道可以使用以下方法计算GetIPv4Statistics BytesReceived并使线程休眠一段时间 但它并没有给出我在浏览器中得到的输出 下面是来自 LINQPad 的一
  • 如何使用不显眼的 jQuery 验证手动重新验证/触发验证?

    我创建了自己的条件验证属性 通过继承来在客户端和服务器上验证我的 MVC 模型RequiredAttribute并实施IClientValidatable 这个想法是 如果我的模型上的布尔属性为 true 则需要另一个属性 在视图中 这表现
  • 为什么要在 Observable 函数上调用 .call() ?

    我是 Angular 的相对初学者 我正在努力理解我从 ng bootstrap 项目中阅读的一些源代码 源代码可以在这里找到 我对 ngOnInit 中的代码感到非常困惑 ngOnInit void const inputValues d
  • C 标准是否认为此标头中有一个或两个“struct uperms_entry”类型?

    您能否给出三个 C 标准 最好是 C99 或 C11 之一的章节和章节 表明以下头文件是否有一个或两个struct uperms entry类型在里面 ifndef UPERMS CACHE INCLUDE define UPERMS CA
  • Java中null是如何实现的?

    我知道 null 不是一种数据类型 But null只能分配给任何类型Object and String Example Object o null it tells that null is an object String b null
  • 如何根据内容动态调整 Twitter Bootstrap 模式的大小

    我有数据库内容 其中包含不同类型的数据 例如 Youtube 视频 Vimeo 视频 文本 Imgur 图片等 它们都有不同的高度和宽度 我在互联网上搜索时发现的只是将大小更改为仅一个参数 它必须与弹出窗口中的内容相同 这是我的 HTML
  • 如何在 Android 上检测网络是否(配置为)移动热点?

    从 Android 4 1 开始 您的设备可以检测是否已连接到移动热点 假定移动热点也运行 Android 4 1 或更高版本 此外 您还可以选择将网络标记为移动热点 在 设置 数据使用 溢出菜单 移动热点 下 但作为一个用户 我指的是开发
  • Perl 新行分隔符问题

    我有一个使用 CR LF 分隔记录的文件 但个别记录有时包含 LF while lt in gt extract record data 我正在尝试按上面的方式阅读此代码 这 正如我所期望的 会拆分仅包含 LF 的记录 然而 我希望重新分配
  • HTMLAgilityPack - 删除节点而不剥离内部文本

    我的html内容是 a href asdf asdf a h5 align left a href d570525d497 htm toc Table of Contents a br h5 我正在使用 HTML Agility Pack
  • 使用 junitPlatform 时设置系统属性

    我无法找到使用 Gradle 执行 JUnit 5 测试时如何设置系统属性 标准test任务可以配置如下 test systemProperty org slf4j simpleLogger defaultLogLevel warn 但是
  • 整数a; ...; (a == a) 失败?

    如果我们设置float and double键入至NaN那么它们不等于任何东西 包括他们自己 这样的事会发生吗int 如果将未初始化的变量与其自身进行比较 任何事情都可能发生 毕竟这是未定义的行为 对于初始化的 int 变量 这种情况不会发
  • 射线体素相交

    我想测试光线与体素场的交点 我可以通过计算与当前体素边缘的射线盒相交来天真地爬过体素场 然后对下一个体素执行相同的操作 直到碰到某些东西 但是没有更快的方法来追踪体素场吗 我在想一些类似的事情Bresenham 直线算法在 3D 中 可以快
  • TypeError:在未实现 HTMLElement 接口的对象上调用“click”

    我有一些 javascript 将数据发送到调用 php 页面的函数 但是我收到一个错误 无法找到任何信息 postData 调用位于另一个普通 JavaScript 函数的中间 但我无法让它将数据提交到 php 页面 function p
  • 如何发布照片。 iOS Facebook SDK 3.1

    我需要在墙上发布一张照片 图片是在我的 iPad 应用程序中生成的 这是我发现的最简单的方法 void postImageToFB UIImage image NSData imageData UIImageJPEGRepresentati
  • 将图像元数据 (EXIF/TIFF/IPTC) 写入 OS X 中的图像文件

    我正在创建一个照片编辑应用程序 到目前为止 我已经成功地从图像文件中读取元数据 在得到这个问题的答案后 在 OS X 上打开 NSImage 时从 EXIF 读取相机数据 source CGImageSourceCreateWithURL