【问题标题】:XMP image tagging and PythonXMP 图像标记和 Python
【发布时间】:2009-02-01 16:28:14
【问题描述】:

如果我要在 Python 中通过 XMP 标记一堆图像,最好的方法是什么?我用过 Perl 的 Image::ExifTool 并且非常习惯它的可靠性。我的意思是这个东西从来没有在成千上万的图像上变砖。

我找到了this,得到了欧洲航天局等一些重量级机构的支持,但它被明确标记为不稳定。

现在,假设我对 C++ 很熟悉,那么在 Python 中直接使用 Adobe XMP toolkit 是多么容易?以前从未这样做过,我不确定我会注册什么。

更新:我尝试了一些库,包括前面提到的工具包,它们仍然很不成熟并且存在明显的问题。我求助于实际编写一个基于 Perl 的服务器,该服务器接受 XML 请求以读取和写入元数据,并使用经过实战测试的 Image::EXIF。代码量实际上非常少,绝对比通过尝试让 Python 库工作来折磨自己要好。服务器解决方案与语言无关,所以它是一个双重的。

【问题讨论】:

    标签: python xmp


    【解决方案1】:

    嗯,他们的网站说 python-xmp-toolkit 使用 Exempi,它基于 Adob​​e XMP 工具包,通过 ctypes。我想说的是,您不太可能自己创建更好的 C++ 代码包装。如果它不稳定(即有问题),那么创建补丁很可能比从头开始自己做更便宜。

    但是,在您的特殊情况下,这取决于您需要多少功能。如果您只需要一个函数,那么将 C++ 代码包装到一个小型 C 扩展库或使用 Cython 是可行的。当您需要拥有所有功能和灵活性时,您必须手动或使用 SWIG 创建包装器,基本上重复其他人已经完成的工作。

    【讨论】:

    • 对,我绝对不想与欧洲航天局竞争 :) 但我想知道这是否是直接使用 Adob​​e 工具包的捷径。我的目的非常有限。只是写一些简单的标签 - 没有花哨的东西。
    • 在这种情况下,我只想写一个小的扩展模块。
    • @Torsten 或者试试 python-xmp-toolkit。 “不稳定”是模糊的,它可能会做他需要做的事情。找出答案的唯一方法是尝试..
    • 如果您在 MAC 上构建 Exempi,那么您就是 SOL,因为没有一个有效的构建(macports、brew)安装 ctypes 所需的模块
    【解决方案2】:

    我在 python-xmp-toolkit 上苦苦挣扎了几个小时,最终放弃了,只是打包了对 ExifTool 的调用。

    a Ruby library 也包含了 ExifTool(尽管比我创建的要好得多);我觉得值得将其移植到 Python 中,以便以一种简单的方式处理 XMP。

    【讨论】:

      【解决方案3】:

      对于 Python 3.x,py3exiv2 支持编辑 XMP 元数据

      使用 py3exiv2,您可以读取和写入所有标准元数据,创建自己的 XMP 命名空间或提取嵌入图像文件中的缩略图。

      我喜欢 py3exiv2 的一点是它建立在 (C++) exiv2 library 之上,看起来维护良好

      我在我的系统(Ubuntu 16.04)上安装它时确实遇到了问题。为了让它工作,我首先必须安装最新版本的 libexiv2-dev (sudo apt-get install libexiv2-dev),然后才安装 py3exiv2 (sudo -H pip3 install py3exiv2)

      以下是我使用 py3exiv2 编写新标签的方法:

      import pyexiv2
      metadata = pyexiv2.ImageMetadata("file_name.jpg")
      metadata.read()
      key = "Xmp.xmp.CustomTagKey"
      value = "CustomTagValue"
      metadata[key] = pyexiv2.XmpTag(key, value)
      metadata.write()
      

      (文档中还有tutorial

      【讨论】:

      • GPL,不幸的是,大多数人一到就死了……
      【解决方案4】:

      对于以后发现这个帖子的人,我想分享我的解决方案。 I put a package up on the Python Package Index (PyPI) called imgtag. 它允许您使用python-xmp-toolkit 进行基本的 XMP 主题字段标签编辑,但将所有实际使用 python-xmp-toolkit 的令人沮丧的废话抽象为一行命令。

      为您的平台安装exempi,然后运行

      python3 -m pip install imgtag
      

      现在你可以这样使用它了:

      from imgtag import ImgTag
      
      # Open image for tag editing
      test = ImgTag(
                 filename="test.jpg", # The image file
                 force_case="lower",  # Converts the case of all tags
                                      # Can be `None`, `"lower"`, `"upper"`
                                      # Default: None
                 strip=True,          # Strips whitespace from the ends of all tags
                                      # Default: True
                 no_duplicates=True   # Removes all duplicate tags (case sensitive)
                                      # Default: True
             )
      
      # Print existing tags
      print("Current tags:")
      for tag in test.get_tags():
          print("  Tag:", tag)
      
      # Add tags
      test.add_tags(["sleepy", "happy"])
      
      # Remove tags
      test.remove_tags(["cute"])
      
      # Set tags, removing all existing tags
      test.set_tags(["dog", "good boy"])
      
      # Save changes and close file
      test.close()
      
      # Re-open for tag editing
      test.open()
      
      # Remove all tags
      test.clear_tags()
      
      # Delete the ImgTag object, automatically saving and closing the file
      del(test)
      

      我还没有为其他 XMP 字段(如描述、日期、创建者等)添加方法。也许有一天我会,但如果你看看现有函数是如何工作的 in the source code,你可能会弄清楚如何自己添加方法。如果您确实添加了更多方法,请提出拉取请求。 :)

      【讨论】:

        【解决方案5】:

        你可以使用 ImageMagic convert,IIRC 还有一个 Python 模块。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-06
          • 2021-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多