- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试获取给定图像中所有 EXIF
标签的列表。使用 Image.propertyItems[]
数组,我可以枚举图像对象实例读取的所有项目,并输出它们的 ID。
我看到有些项目没有列在那里,其他应用程序包括 Windows 资源管理器似乎没有问题检索。
例如在下面的代码中...
Image img = new Bitmap("C:\\IMAG0648.jpg");
foreach (PropertyItem property in img.PropertyItems)
{
Trace.WriteLine(property.Id);
}
我得到了大部分 项目的列表,特别是虽然我遗漏了(可能还有其他)0x010F
和 0x0110
。我知道这些项目在那里,因为我可以在另一个 EXIF 编辑器(如 PhotoME)中打开相同的图像,它们清楚地在那里,并且清楚地标记为正确的 ID。
EXIF
中是否存在嵌套级别,而我没有走得足够远,或者是否有某种原因无法以上面的基本形式工作?
最佳答案
尝试 ExifLib - 有一个带有源代码的演示项目,可以从您可以使用的图像中提取所有标签。
编辑:我将附加我的答案来解释为什么我认为 .Net Image 类没有像我们预期的那样处理所有 EXIF 标签。但是,我将保留上面的初始链接和建议,因为我相信这是最终的最佳选择。
好的,关于为什么:
我在下面描述的测试使用了 Windows 7 显示品牌和型号的 EXIF 数据的图像(通过右键单击文件 > 属性 >“详细信息”选项卡 >“相机”部分),但在 .Net 中,PropertyItems
不包含这些相同的 EXIF 标签。用HTC One拍的图在另一个回答里提到了,所以我找到了满足我测试的图here . (具体来说,我使用了该网页中的 original-2.jpg、original-4.jpg 和 original-8.jpg。)
首先,我查看了 img.PropertyItems.Count()
并得到了 32。所以里面有数据! (很明显,我们知道在我的例子中 Windows 7 看到的是 EXIF 标签)。但是,当我遍历 .PropertyItems
并查看每个 Id
时(根据您的原始问题):
img.PropertyItems.Single(x => x.Id == 305).Value
我会得到 SoftwareUsed(或者如果我使用 206 我会得到 DateTime)EXIF 属性那么,就您的观点而言,为什么 .Net Image 类没有看到 ID 为 271/272(同样是相机品牌/型号)的 EXIF 标签?
我深入研究了 ExifLib 的源代码(答案顶部的链接),认为我明白发生了什么:
private byte[] GetTagBytes(...)
方法(第 655 行),您会看到字节偏移用于查找“Exif IDF”和每个标签的总空间因此,当没有任何字节偏移时,.Net Image 类似乎能够通过 PropertyItems
正确返回 EXIF 标签。
使用 ExifDataView ( http://www.nirsoft.net/utils/exif_data_view.html ) 我能够验证这一点:
ExifLib 代码可以正确处理这些偏移量和/或多个空字符,而 .Net 则不能。
结果是 .Net Image 类不会将这些属性作为 PropertyItems
的一部分进行迭代,并在使用 image.PropertyItems.Single( x => x.Id == tagMake).Value
底线:使用 ExifLib 或其他一些旨在处理提取 EXIF 数据的第 3 方库,如果您希望它在所有图像上正常工作。如果您希望 .Net Image 类在字节恰到好处的某些时候工作:-)
关于c# - 并非所有使用 Image.PropertyItems 检索的图像属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082918/
我有一个“创建”的自定义 PropertyItem 并将一些值存储在图像中。我确信它正确存储了它,因为新图像的大小会增加(取决于我制作的字符串有多大)。 --【问题在最下方】-- 这是我将 Prope
我正在加载 Image来自byte[]使用 MemoryStream并通过检查图像的 ProperyItems 获取有关图像的信息.不过,在这样做的过程中,我注意到一些奇怪的行为,其中一些图像的 Pr
我知道 Image.PropertyItems 数组包含有关已加载图像的所有元数据信息。 但是 您怎么知道例如ID = 20736 是例如的值每张幻灯片的 GIF 时间? 是否有所有已知 ID 的列表
我正在尝试将 EXIF 数据从一张图片复制到另一张图片,使用如下方式: foreach (PropertyItem item in SourceImage.PropertyItems) { D
我正在尝试获取给定图像中所有 EXIF 标签的列表。使用 Image.propertyItems[] 数组,我可以枚举图像对象实例读取的所有项目,并输出它们的 ID。 我看到有些项目没有列在那里,其他
在 C# 中,我试图在 jpg 文件中设置以下属性。但是当我尝试取回它们时,我得到了 Property not found 异常。此外,SetPropertyItem 调用无法报告成功\失败,因此很难
我有点惊讶和不解。我尝试从图像中读取属性项。特别是,我对“拍摄日期”感兴趣。我已经编写了一个程序来执行此操作。或多或少。对于某些文件,它可以完美地工作,但是...... 我有一些文件在属性中有一个“拍
我是一名优秀的程序员,十分优秀!