如何在Python(PIL)中操作TIFF标头值?

时间:2015-03-05 20:33:44

标签: python python-imaging-library tiff

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

im = Image.open('FRONT200BW_1.TIF')

我可以通过以下方式看到TIFF标题:

im.tag[270]
'returned description'

我在这里碰到了一堵砖墙。我需要使用Artist(315),Date_Time(306),Document_Name(269),Image_Description(270)和Page_Name(285),然后将文件保存回磁盘,而不对图像数据进行其他更改,也不任何其他标题值/标记。

似乎我应该能够做到这样的事情:

im.tag[270] = 'my new description'

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

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

当我通过

进行修改之前检查该值
im.tag.tags

我得到的是一个字典,它返回的字符串返回了之前存在于文件中的描述。在我如上所述更改它并查看im.tag.tags之后,它将键270的值从字符串更改为元组。并且....就像我说的那样,保存它似乎消灭了所有标题。

如何更改这些标头值?

2 个答案:

答案 0 :(得分:4)

希望这仍然会有所帮助。

您对标题的更改未保存,或者根本没有保存标记的原因是您没有正确保存它。据我了解,当对加载的图像进行更改时,更改的图像仅存在于内存中,并与其来自的文件解除关联,因此删除了特定于TIFF的标头。

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

  1. 在加载图片后立即保留对tag属性(PIL.TiffImagePlugin.ImageFileDirectory对象)的引用。
  2. 按照您的指定对ImageFileDirectory进行更改。
  3. 您必须导入模块PIL.TiffImagePlugin
  4. PIL.TiffImagePlugin模块的属性WRITE_LIBTIFF必须设置为False。
  5. 当你最终调用save方法时,你需要传递一个关键字参数tiffinfo,设置为首次加载图像后引用的ImageFileDirectory对象。
  6. 这可能会也可能不会要求您使用PIL的Pillow前叉,尽管我并不确定。

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

答案 1 :(得分:0)

对于任何有兴趣的人......我放弃了为此工作的PIL。我确信那里有一个错误,我没有时间来修复它。如果你使用任何标题,那么它会吹掉Image.save()上的所有标题信息。

相反,我安装了libtiff库(yum在基于redhat的系统上安装libtiff),然后使用了subprocess.call(' tiffset -s X'),其中X是从我的python代码更改的标头ID