使用 python 拆分多页 tiff 图像

Split multi-page tiff image using python

我有一个功能可以拆分多页 tiff

from PIL import Image, ImageSequence

im = Image.open("Sample.tiff")

for i, page in enumerate(ImageSequence.Iterator(im)):
    page.save("Page%d.png" % i)

该代码适用于某些 tiff 图像,但不适用于所有图像。这是不适用于代码的 tiff 示例 它引发了这样的错误

Traceback (most recent call last):
  File "C:\Users\Future\Desktop\demo.py", line 6, in <module>
    page.save("Page%d.png" % i)
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\PIL\Image.py", line 2130, in save
    self._ensure_mutable()
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\PIL\Image.py", line 619, in _ensure_mutable
    self._copy()
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\PIL\Image.py", line 612, in _copy
    self.load()
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\PIL\TiffImagePlugin.py", line 1088, in load
    return self._load_libtiff()
  File "C:\Users\Future\AppData\Local\Programs\Python\Python39\lib\site-packages\PIL\TiffImagePlugin.py", line 1192, in _load_libtiff
    raise OSError(err)
OSError: -9

tiff 样本:https://www.mediafire.com/view/9l3iyke0s7t2col/Sample.tiff/file

你不说你的两个文件哪一个有效,哪个无效!我检查了两个文件:

tiffinfo IMAGE1.TIF > 1.txt
tiffinfo IMAGE2.TIF > 2.txt

然后我将两个文本文件进行了比较:

opendiff [12].txt

主要区别在于压缩 - 这两者对于某些软件来说都可能存在问题。一个是 CCITT Group4,另一个是 JPEG-compressed.

如果您没有 tiffinfo(TIFF 库包的一部分),您也可以使用:

exiftool IMAGE.TIF

ImageMagick:

magick identify -verbose IMAGE.TIF

我建议您检查 PIL 安装情况,因为您需要安装 lib tiff 来处理压缩图像:

python -m PIL

--------------------------------------------------------------------
Pillow 9.0.1
Python 3.10.0 (v3.10.0:b494f5935c, Oct  4 2021, 14:59:19) [Clang 12.0.5 (clang-1205.0.22.11)]
--------------------------------------------------------------------
Python modules loaded from /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PIL
Binary modules loaded from /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PIL
--------------------------------------------------------------------
--- PIL CORE support ok, compiled for 9.0.1
--- TKINTER support ok, loaded 8.6
--- FREETYPE2 support ok, loaded 2.11.1
--- LITTLECMS2 support ok, loaded 2.13
--- WEBP support ok, loaded 1.2.2
--- WEBP Transparency support ok
--- WEBPMUX support ok
--- WEBP Animation support ok
--- JPEG support ok, compiled for libjpeg-turbo 2.1.2
--- OPENJPEG (JPEG2000) support ok, loaded 2.4.0
--- ZLIB (PNG/ZIP) support ok, loaded 1.2.11
--- LIBTIFF support ok, loaded 4.2.0
*** RAQM (Bidirectional Text) support not installed
*** LIBIMAGEQUANT (Quantization method) support not installed
--- XCB (X protocol) support ok
--------------------------------------------------------------------
BLP
Extensions: .blp
Features: open
--------------------------------------------------------------------
BMP image/bmp
Extensions: .bmp
Features: open, save
--------------------------------------------------------------------
BUFR
Extensions: .bufr
Features: open, save
--------------------------------------------------------------------
CUR
Extensions: .cur
Features: open
--------------------------------------------------------------------
DCX
Extensions: .dcx
Features: open
--------------------------------------------------------------------
DDS
Extensions: .dds
Features: open, save
--------------------------------------------------------------------
DIB image/bmp
Extensions: .dib
Features: open, save
--------------------------------------------------------------------
EPS application/postscript
Extensions: .eps, .ps
Features: open, save
--------------------------------------------------------------------
FITS
Extensions: .fit, .fits
Features: open, save
--------------------------------------------------------------------
FLI
Extensions: .flc, .fli
Features: open
--------------------------------------------------------------------
FTEX
Extensions: .ftc, .ftu
Features: open
--------------------------------------------------------------------
GBR
Extensions: .gbr
Features: open
--------------------------------------------------------------------
GIF image/gif
Extensions: .gif
Features: open, save, save_all
--------------------------------------------------------------------
GRIB
Extensions: .grib
Features: open, save
--------------------------------------------------------------------
HDF5
Extensions: .h5, .hdf
Features: open, save
--------------------------------------------------------------------
ICNS image/icns
Extensions: .icns
Features: open, save
--------------------------------------------------------------------
ICO image/x-icon
Extensions: .ico
Features: open, save
--------------------------------------------------------------------
IM
Extensions: .im
Features: open, save
--------------------------------------------------------------------
IMT
Features: open
--------------------------------------------------------------------
IPTC
Extensions: .iim
Features: open
--------------------------------------------------------------------
JPEG image/jpeg
Extensions: .jfif, .jpe, .jpeg, .jpg
Features: open, save
--------------------------------------------------------------------
JPEG2000 image/jp2
Extensions: .j2c, .j2k, .jp2, .jpc, .jpf, .jpx
Features: open, save
--------------------------------------------------------------------
MCIDAS
Features: open
--------------------------------------------------------------------
MPEG video/mpeg
Extensions: .mpeg, .mpg
Features: open
--------------------------------------------------------------------
MSP
Extensions: .msp
Features: open, save, decode
--------------------------------------------------------------------
PCD
Extensions: .pcd
Features: open
--------------------------------------------------------------------
PCX image/x-pcx
Extensions: .pcx
Features: open, save
--------------------------------------------------------------------
PIXAR
Extensions: .pxr
Features: open
--------------------------------------------------------------------
PNG image/png
Extensions: .apng, .png
Features: open, save, save_all
--------------------------------------------------------------------
PPM image/x-portable-anymap
Extensions: .pbm, .pgm, .pnm, .ppm
Features: open, save
--------------------------------------------------------------------
PSD image/vnd.adobe.photoshop
Extensions: .psd
Features: open
--------------------------------------------------------------------
SGI image/sgi
Extensions: .bw, .rgb, .rgba, .sgi
Features: open, save
--------------------------------------------------------------------
SPIDER
Features: open, save
--------------------------------------------------------------------
SUN
Extensions: .ras
Features: open
--------------------------------------------------------------------
TGA image/x-tga
Extensions: .icb, .tga, .vda, .vst
Features: open, save
--------------------------------------------------------------------
TIFF image/tiff
Extensions: .tif, .tiff
Features: open, save, save_all
--------------------------------------------------------------------
WEBP image/webp
Extensions: .webp
Features: open, save, save_all
--------------------------------------------------------------------
WMF
Extensions: .emf, .wmf
Features: open, save
--------------------------------------------------------------------
XBM image/xbm
Extensions: .xbm
Features: open, save
--------------------------------------------------------------------
XPM image/xpm
Extensions: .xpm
Features: open
--------------------------------------------------------------------
XVTHUMB
Features: open
--------------------------------------------------------------------

如果你不能让 PIL 工作,你可以考虑 Christoph 的 tifffile


注意 exiftool 可以这样告诉你压缩率:

exiftool -s -s -s  -compression Sample1.tiff
T6/Group 4 Fax

或者,与Python相同:

import exiftool

# If  "exiftool" is not on your PATH, add the full path inside parentheses on next line
with exiftool.ExifTool() as et:
     c = et.execute(b"-compression", b"Sample1.tiff")

您还可以使用 Python magic 模块获取 TIFF 压缩类型:

import magic

print(magic.from_file('a.tif'))

示例输出

'TIFF image data, big-endian, direntries=16, height=20, bps=0, compression=LZW, PhotometricIntepretation=RGB, orientation=upper-left, width=20'