从目标 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中的磁盘仅读取一个图像颜色通道

从位图图像中读取2D纹理(C ++,OpenGL)

从 OpenCV(C++)中的目录读取多个图像

Python爬虫新手进阶版:怎样读取非结构化图像视频语音数据

从 C# WPF 应用程序中读取 MS Access 数据库中的图像 [重复]

使用模拟读取图像