用Python从字符串中写入TIFF文件

4

我需要一种简单的方法,能够在Python中从一个字符串轻松地编写压缩的TIFF文件。我已经查看了Python Imaging Library PIL,但是我需要编写一个非常特定的TIFF格式,而PIL目前只支持未压缩的格式。我需要编写一个带有一行简单文本的LZW压缩条纹TIFF。我宁愿不从头开始编写,但如果必须的话,我也会这样做。


1
我最终只是使用了我已经编写的.NET代码,并将其导出为命令行exe,然后调用它而不是tiffCP。基本上是相同的操作,但我已经在我的.NET工具中设置了所有设置,所以我不必担心从Python传递任何设置,只需传递一个字符串即可。 - keepitreall89
2个回答

5
我刚刚使用WinPython编写了一个带有LZW压缩的TIFF文件:
from PIL import Image, TiffImagePlugin

[...]

TiffImagePlugin.WRITE_LIBTIFF = True
im.save(filename, compression = "tiff_lzw")
TiffImagePlugin.WRITE_LIBTIFF = False

(请参见此WinPython工单)。

(编辑于2014年5月13日:修正了我的READ_LIBTIFF/WRITE_LIBTIFF混淆)。

(编辑于2015年2月23日:更新了WinPython链接)。


现在,compression="tiff_lzw"可以直接使用,无需进行TiffImagePlugin操作。 - markemus

1

我以前用过这段代码,所以我可以说它是有效的。这个脚本来自于1997年,而且PIL还没有实现压缩TIFF写入。

# 
# use "tiffcp" to write compressed TIFF files.
#
# fredrik lundh (may 13, 1997)
#

import os, tempfile

# install standard driver
import Image, TiffImagePlugin 

LZW      = "lzw"
ZIP      = "zip"
JPEG     = "jpeg"
PACKBITS = "packbits"
G3       = "g3"
G4       = "g4"

def _save(im, fp, filename):

    # check compression mode
    try:
    compression = im.encoderinfo["compression"]
    except KeyError:
    # use standard driver
    TiffImagePlugin._save(im, fp, filename)
    else:
    # compress via temporary file
    if compression not in (LZW, ZIP, JPEG, PACKBITS, G3, G4):
        raise IOError, "unknown compression mode"
    file = tempfile.mktemp()
    im.save(file, "TIFF")
    os.system("tiffcp -c %s %s %s" % (compression, file, filename))
    try: os.unlink(file)
    except: pass

Image.register_save(TiffImagePlugin.TiffImageFile.format, _save)

if __name__ == "__main__":
    # test
    im = Image.open("/usr/iv/tip/images/lenna.ppm")
    im = im.point(lambda v: v >= 128 and 255, "1")
    im.save("lenna.tif", compression=G4)

这段代码(afaict)只是通过使用标准的PIL库添加了使用压缩TIFF格式写入的功能,因此如果您已经将文本写入了一个PIL Image对象中,那么实现起来应该非常容易。

1
不错的技巧,但请注意这需要一个命令行工具,可能没有安装,特别是在Windows上。您可以在此处获取tiffcp的Windows版本:http://www.verypdf.com/tif2pdf/image2pdf_emf2pdf_cmd.zip - kindall
1
当你使用Linux时,你就会忘记所有这些事情。感谢指出这一点。 - Blender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接