【问题标题】:Only get DateTimeOriginal with exiftool仅使用 exiftool 获取 DateTimeOriginal
【发布时间】:2018-07-12 22:12:31
【问题描述】:

大家好,

几天以来,我在尝试获取 .jpg 或 .png 图像文件的日期时遇到了问题,即拍摄照片的时间。 我相信它被称为 DateTimeOriginal。 我想要做的是只获取这一特定信息,DateTimeOriginal,不多也不少。

这是一个自制项目的一部分,这是一个按拍摄日期对照片进行排序的程序。 我正在用 VB 编程,而对于 exif 数据,我正在调用一个批处理文件。

所以我知道如何使用 exiftool。它的常见用途是: exiftool file.jpg 但我需要类似的东西: exiftool -DateTimeOriginal file.jpg >> DateTaken.txt 我试过这个,但我没有得到日期,我只得到了在目录中找到的任何 jpg 的列表,但没有元数据。 我一直在寻找这样的任何选项,但我找不到任何有用的东西。也许还有另一种更有效的方法来获取图像的元数据,仅使用 VB。

有没有人建议或其他想法?

谢谢

【问题讨论】:

  • 通用软件的使用问题属于Super User,但是您考虑过文件没有那个数据的可能性吗?
  • .png图片不存储exif数据。即使在jpg文件中数据也可以删除。你看看tooltipinfo.bat可以通过windows api读取exif数据。
  • @AndrewMorton 类似的问题已移至stackoverflow,因为它们不属于超级用户,这就是我在这里问的原因,这也不是专门的“软件”。是的,我考虑过这一点,但关键是,批处理文件甚至不能像这样工作,我搜索一个建议,让这个批处理文件正常工作。
  • @npocmaka 是的,你的权利,但是,我只需要它来处理 jpgs。并感谢您的提示!
  • @npocmaka,PNG 文件现在有一个 EXIF 标准。它存储在eXIf 辅助块中。见ftp-osl.osuosl.org/pub/libpng/documents/…

标签: vb.net batch-file exif exiftool


【解决方案1】:

您有正确的命令从文件 (exiftool -DateTimeOriginal file.jpg) 中获取 DateTimeOriginal 标记。但是您说您正在获取目录中的文件名列表,这听起来像是您传递的是目录名,而不是文件名。如果您希望只为目录中那些在标记中有值的文件获取DateTimeOriginal,请使用exiftool -if "$DateTimeOriginal" -DateTimeOriginal C:/path/to/dir。然后不会列出任何没有DateTimeOriginal 的文件。

需要注意的一点是,windows 的“拍摄日期”属性将由各种元数据标签填充,具体取决于文件类型。例如,在 PNG 文件中,Windows 将使用PNG:CreationTime。在 jpg 文件中,Windows 将依次使用EXIF:DateTimeOriginalIPTC:DateCreated + IPTC:TimeCreatedXMP:CreateDateEXIF:CreateDate,然后是XMP:DateTimeOriginal 标签。

【讨论】:

    【解决方案2】:

    经过一番挖掘,我发现如果是位图,你可以得到一个属性列表。

    不幸的是,属性 ID 是数字且相当神秘。

    查看here了解更多信息

    经过一番挖掘,propertyId &h132 (一个十六进制数)似乎是以 ascii 编码的整数数组形式存储的日期。此函数查找 propertyid &h132 并将日期信息作为字符串返回,格式为 year:month:date hour:minute:second 格式。

    您可能会因本地化而有所不同。例如,使用 /:- 作为日期分隔符等,因此,要将其解析为日期类型,您可能需要解决这个问题。

    Public Function GetImageTakenDate(theimage As Bitmap) As String
        Dim propItems As List(Of PropertyItem) = theimage.PropertyItems.ToList
        Dim dt As PropertyItem = propItems.Find(Function(x) x.Id = &H132)
        Dim datestring As String = ""
        For Each ch As Integer In dt.Value
            datestring += Chr(ch)
        Next
        datestring = datestring.Remove(datestring.Length - 1)
        Return datestring
    End Function
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      相关资源
      最近更新 更多