Записать файл TIFF в Python из строки - PullRequest
3 голосов
/ 10 марта 2011

Мне нужен способ легко написать сжатый файл TIFF из строки в Python. Я уже смотрю на библиотеку изображений Python PIL Но мне нужно написать очень специфический формат TIFF, и в настоящий момент PIL поддерживает только несжатый формат. Мне нужно написать сжатый TIFF в формате LZW с одной простой строкой текста. Я бы предпочел не писать что-то с нуля, но если я это сделаю, то сделаю.

Ответы [ 2 ]

4 голосов
/ 12 мая 2014

Я только что использовал WinPython для записи файла TIFF со сжатием LZW:

from PIL import Image, TiffImagePlugin

[...]

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

(см. этот билет WinPython ).

(Изменить 2014-05-13: исправлена ​​моя путаница в READ_LIBTIFF / WRITE_LIBTIFF).

(Изменить 2015-02-23: обновлена ​​ссылка WinPython).

1 голос
/ 10 марта 2011

Я использовал этот код в прошлом, поэтому я могу сказать, что он работает.Этот сценарий относится к 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) просто добавляет возможность записи сжатых TIFFиспользуя стандартную библиотеку PIL, поэтому, если вы записали свой текст в объект PIL Image, это должно быть очень легко реализовать.

...