从目标 C 中的图像读取非标准属性
Posted
技术标签:
【中文标题】从目标 C 中的图像读取非标准属性【英文标题】:Read non-standard properties from an image in objective C 【发布时间】:2015-08-22 20:37:35 【问题描述】:我正在使用此代码 (Writing image metadata (EXIF/TIFF/IPTC) to image file in OS X) 从图像文件中读取 EXIF/TIFF/IPTC 数据。它工作得很好,但我还需要复制剪切路径。它被保存到一个名为“Photoshop”的非标准索引中(就像其他被称为 Iptc 和类似的索引一样)。
我不知道如何访问此信息以将其复制到新创建的 NSImage。链接中的方法似乎没有访问任何非标准信息。任何帮助表示赞赏。谢谢
编辑----
这是一个示例图片:http://www.mad-sharky.com/clipping_path.jpg
这个包含剪切路径,可以用这个工具验证:http://regex.info/exif.cgi 你可以看到“Photoshop”部分。该部分包含我正在使用的代码中缺少的所有数据。 (代码和上面的链接一样)
【问题讨论】:
你能提供一个图像示例吗? (和你的代码),当你 NSLOG 时你真的看到了这个属性 完成.. 还添加了赏金! 我注意到该站点使用 exiftool (sno.phy.queensu.ca/~phil/exiftool)。我之前将其捆绑在一个应用程序中并使用 NSTask 对其进行调用。我可以看到 exiftool 网站上列出的 Photoshop 标签列表。但是对于我的生活,使用 exiftool 无法在您的文件中看到它们。 ?? 我已经取得了一些进展,但在剪切路径数据方面并没有大量使用,您在这批中的实际标签是什么让我猜测。您可以将它们添加到您的答案中吗?因为我可能会得到它们但没有意识到.. @markhunte 我不确定我是否理解你在问什么...... 【参考方案1】:我只有一个没有剪辑路径的旧 .psd 文件。但确实有层次。
这个简短的示例代码使用 Photoshop 图像属性。 kCGImageProperty8BIMDictionary
NSURL *imageFileURL = [NSURL fileURLWithPath:@"/users/username/foo.psd"];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL);
NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0,
NULL);
NSDictionary *bim = properties[(__bridge id)kCGImageProperty8BIMDictionary];
NSLog(@"bim %@",bim);
CFRelease(imageSource);
在我的图像中,我有一些图像层:
上面代码中的 NSLog 返回
imageRead[11220:452087] bim 图层名称 = ( "第 0 层", “第 5 层”, “第 6 层”, “第 4 层”, “第 3 层”, “第 2 层”, “第 1 层” ); 版本 = 1;
如果我想知道我可以使用的所有键:
id allKeys = [bim allKeys];
NSLog(@"allKeys %@",allKeys);
得到:
imageRead[11531:463848] allKeys ( 版本, 图层名称)
然后我可以使用:
id LayerNames = [bim objectForKey:@"LayerNames"];
NSLog(@"LayerNames %@",LayerNames);
得到:
imageRead[11563:465657] 图层名称 ( "第 0 层", “第 5 层”, “第 6 层”, “第 4 层”, “第 3 层”, “第 2 层”, “第 1 层”)
或者
valueForKey:、allValues
不幸的是,我无法测试剪切路径是否会返回
【讨论】:
用包含剪切路径的 jpg 更新了帖子,并为答案添加了赏金。 给了你赏金只是为了不要把它扔掉。如果你碰巧找到了解决方案,请发布它.. :) 谢谢 我会的,希望我能找到更简单的方法来获取这些字段 愚蠢的问题。我的最终目标是获取现有图像,然后编辑一些关键字。据我了解,为此我必须创建一个新的 NSImage 并复制所有数据,问题是访问这些非标准数据。现在的问题是:是否可以“按原样”复制所有内容,而不必单独阅读这些条目?那么创建一个与硬盘驱动器完全相同的 NSImage 吗?我需要做的就是拥有一个相同的副本,只更改几个关键字,而不会丢失所有其他数据。 @sharkyenergy,我没有找到本地获取信息的方法,但是在这些 cmets 中查看您之前的问题,这就是我要走的路。复制图像,然后更新副本关键字。我假设您正在处理文件,因此您可能不需要创建新的 NSImage 只需使用将在查找器中复制文件的 API 之一。 NSFilemanager 我认为。然后使用 Coregraphics API 更改文案的关键字。或者使用 Coregraphics 通过 NSImage/CGImage 复制图像并使用新信息保存。我对这一切的假设是,复制会带走额外的数据..以上是关于从目标 C 中的图像读取非标准属性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用C ++从opencv中的磁盘仅读取一个图像颜色通道
Python爬虫新手进阶版:怎样读取非结构化图像视频语音数据