gpt4 book ai didi

c# - 并非所有使用 Image.PropertyItems 检索的图像属性

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

我正在尝试获取给定图像中所有 EXIF 标签的列表。使用 Image.propertyItems[] 数组,我可以枚举图像对象实例读取的所有项目,并输出它们的 ID。

我看到有些项目没有列在那里,其他应用程序包括 Windows 资源管理器似乎没有问题检索。

例如在下面的代码中...

Image img = new Bitmap("C:\\IMAG0648.jpg");
foreach (PropertyItem property in img.PropertyItems)
{
Trace.WriteLine(property.Id);
}

我得到了大部分 项目的列表,特别是虽然我遗漏了(可能还有其他)0x010F0x0110。我知道这些项目在那里,因为我可以在另一个 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 时(根据您的原始问题):

  • 我得到 32 个结果
  • 我没有得到 271(0x010F - 相机制造商)或 272(0x0110 - 相机型号)的结果 ID
  • 我确实得到了 282、283、296、305、306 和 27 个其他 5 位数的 ID
  • 如果我使用 img.PropertyItems.Single(x => x.Id == 305).Value 我会得到 SoftwareUsed(或者如果我使用 206 我会得到 DateTime)EXIF 属性

那么,就您的观点而言,为什么 .Net Image 类没有看到 ID 为 271/272(同样是相机品牌/型号)的 EXIF 标签?

我深入研究了 ExifLib 的源代码(答案顶部的链接),认为我明白发生了什么:

  • 如果您查看 ExifReader.cs 中的 private byte[] GetTagBytes(...) 方法(第 655 行),您会看到字节偏移用于查找“Exif IDF”和每个标签的总空间
  • 此方法返回一个特定的字节数组,然后将其转换为正确的数据类型
  • 如果该类型是 ASCII 字符串 - 删除空字符并调整日期格式

因此,当没有任何字节偏移时,.Net Image 类似乎能够通过 PropertyItems 正确返回 EXIF 标签。

使用 ExifDataView ( http://www.nirsoft.net/utils/exif_data_view.html ) 我能够验证这一点:

  • 我发现当值长度为 4(“HTC”+ 空字符)时,我总是能够使用 .Net 正确检索品牌和型号
  • 当长度为 5(“HTC”+ null + null?)时,我从未能够使用 .Net
  • 在我上面的测试(使用 original-4.jpg 图像)中,SoftwareUsed 和 DateTime 标签起作用了,因为这些标签的长度为(字符串长度)+ 1(表示空字符)。 Camera Make 标签长度为(字符串长度)+ 2 并且不起作用。这似乎抛开了一切。

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/

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