如何在 Python (PIL) 中操作 TIFF header 值?
How to Manipulate TIFF header values in Python (PIL)?
我可以通过 PIL 读入 TIFF 图像文件...
im = Image.open('FRONT200BW_1.TIF')
我可以通过以下方式查看 TIFF headers:
im.tag[270]
'returned description'
这是我碰壁的地方。我需要 fiddle with Artist (315), Date_Time (306), Document_Name (269), Image_Description (270) and Page_Name (285 ) 然后将文件保存回磁盘,不对图像数据或任何其他 header 值/标签进行其他更改。
看来我应该能够做这样的事情:
im.tag[270] = 'my new description'
但是当我这样做的时候,有趣的事情发生了....
如果我对该文件执行 save() 并检查它,它没有新的描述 header,实际上会丢失所有 header 值。
当我在通过
对其进行修改之前检查该值时
im.tag.tags
我得到的是一个看起来像字典的东西,返回了一个字符串,用于描述文件中以前存在的描述。在我如上所述更改它并查看 im.tag.tags 之后,它将键 270 的值从字符串更改为元组。而且....就像我说的那样,保存它似乎会消除所有 headers。
如何更改这些 header 值?
任何感兴趣的人...我放弃了为此工作的 PIL。我确信那里有一个错误,我没有时间修复它。如果你对 header 中的任何一个胡闹,那么它会吹走 Image.save() 上的所有 header 信息。
相反,我安装了 libtiff 库(yum 在 redhat-based 系统上安装 libtiff),然后使用 subprocess.call('tiffset -s X '),其中 X 是 header id 以从我的 python 代码。
希望这仍然会有所帮助。
您对 header 所做的更改未被保存,或者实际上根本没有保存任何标记的原因是您未正确保存它。据我了解,当对加载的图像进行更改时,更改后的图像仅存在于内存中,并且与其来自的文件断开关联,因此 TIFF-specific headers 被删除。
要将图像保存为带有 header 的 TIFF 文件,您必须:
- 在加载图像后立即保留对
tag
属性(这是 PIL.TiffImagePlugin.ImageFileDirectory
object)的引用。
- 按照您指定的方式对
ImageFileDirectory
进行更改。
- 您必须导入模块
PIL.TiffImagePlugin
- 此
PIL.TiffImagePlugin
模块具有必须设置为 False 的属性 WRITE_LIBTIFF
。
- 当您最终调用
save
方法时,您需要将关键字参数 tiffinfo
设置为您在首次加载图像后引用的 ImageFileDirectory
object 传递给它。
这可能需要也可能不需要您使用 PIL 的 Pillow 叉,但我不太确定。
有关更多信息和代码示例,请参阅:https://github.com/python-pillow/Pillow/issues/983
我可以通过 PIL 读入 TIFF 图像文件...
im = Image.open('FRONT200BW_1.TIF')
我可以通过以下方式查看 TIFF headers:
im.tag[270]
'returned description'
这是我碰壁的地方。我需要 fiddle with Artist (315), Date_Time (306), Document_Name (269), Image_Description (270) and Page_Name (285 ) 然后将文件保存回磁盘,不对图像数据或任何其他 header 值/标签进行其他更改。
看来我应该能够做这样的事情:
im.tag[270] = 'my new description'
但是当我这样做的时候,有趣的事情发生了....
如果我对该文件执行 save() 并检查它,它没有新的描述 header,实际上会丢失所有 header 值。
当我在通过
对其进行修改之前检查该值时im.tag.tags
我得到的是一个看起来像字典的东西,返回了一个字符串,用于描述文件中以前存在的描述。在我如上所述更改它并查看 im.tag.tags 之后,它将键 270 的值从字符串更改为元组。而且....就像我说的那样,保存它似乎会消除所有 headers。
如何更改这些 header 值?
任何感兴趣的人...我放弃了为此工作的 PIL。我确信那里有一个错误,我没有时间修复它。如果你对 header 中的任何一个胡闹,那么它会吹走 Image.save() 上的所有 header 信息。
相反,我安装了 libtiff 库(yum 在 redhat-based 系统上安装 libtiff),然后使用 subprocess.call('tiffset -s X '),其中 X 是 header id 以从我的 python 代码。
希望这仍然会有所帮助。
您对 header 所做的更改未被保存,或者实际上根本没有保存任何标记的原因是您未正确保存它。据我了解,当对加载的图像进行更改时,更改后的图像仅存在于内存中,并且与其来自的文件断开关联,因此 TIFF-specific headers 被删除。
要将图像保存为带有 header 的 TIFF 文件,您必须:
- 在加载图像后立即保留对
tag
属性(这是PIL.TiffImagePlugin.ImageFileDirectory
object)的引用。 - 按照您指定的方式对
ImageFileDirectory
进行更改。 - 您必须导入模块
PIL.TiffImagePlugin
- 此
PIL.TiffImagePlugin
模块具有必须设置为 False 的属性WRITE_LIBTIFF
。 - 当您最终调用
save
方法时,您需要将关键字参数tiffinfo
设置为您在首次加载图像后引用的ImageFileDirectory
object 传递给它。
这可能需要也可能不需要您使用 PIL 的 Pillow 叉,但我不太确定。
有关更多信息和代码示例,请参阅:https://github.com/python-pillow/Pillow/issues/983