如何在Python(PIL)中处理TIFF标头值?

Rob*_*lle 0 python tiff python-imaging-library

我可以通过PIL读取TIFF图像文件...

im = Image.open('FRONT200BW_1.TIF')
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式查看TIFF标头:

im.tag[270]
'returned description'
Run Code Online (Sandbox Code Playgroud)

这是我碰到砖墙的地方。我需要摆弄Artist(315),Date_Time(306),Document_Name(269),Image_Description(270)和Page_Name(285),然后将文件保存回磁盘,而无需对图像数据进行其他更改任何其他标头值/标签。

看来我应该能够执行以下操作:

im.tag[270] = 'my new description'
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,有趣的事情发生了...

如果我对该文件执行save()并进行检查,则它没有新的描述标头,实际上会丢失所有标头值。

当我检查之前通过的价值

im.tag.tags
Run Code Online (Sandbox Code Playgroud)

我得到的是一个字典外观的东西,返回了一个字符串,用于描述文件中先前存在的描述。在如上所述更改它并查看im.tag.tags之后,它会将键270的值从字符串更改为元组。就像我说的,保存它似乎会擦除所有标头。

如何更改这些标头值?

Kar*_*gat 5

希望这仍然会有所帮助。

您对标头所做的更改未保存或实际上根本没有保存任何标签的原因是,您没有正确保存它。据我了解,对加载的图像进行更改时,更改后的图像仅存在于内存中,并且与它来自的文件脱离关联,因此删除了TIFF特定的标头。

因此,要将图像保存到带有标题的TIFF文件中,您必须:

  1. 加载图像后立即保留对tag属性(它是一个PIL.TiffImagePlugin.ImageFileDirectory对象)的引用。
  2. ImageFileDirectory根据指定对进行更改。
  3. 您必须导入模块 PIL.TiffImagePlugin
  4. PIL.TiffImagePlugin模块的属性WRITE_LIBTIFF必须设置为False。
  5. 当您最终调用该save方法时,需要向其传递关键字参数tiffinfo集,该参数集设置为ImageFileDirectory您在首次加载图像后所引用的对象。

尽管我不确定,但这可能需要也可能不需要使用PIL的Pillow叉子。

有关更多信息和代码示例,请参见:https : //github.com/python-pillow/Pillow/issues/983