PIL(pillow)の使い方(TIFF読み書き)

TIFFでマルチページ保存する

いろいろとエラーにあってうまくいってなかったが解決した。そもそも、サンプルのTIFFPhotoshopで作りマルチページにするという 簡単な確認を行うだけであったがいろいろとエラーにぶつかっていた

TiffImagePluginについて

PILは、画像フォーマット毎にプラグイン形式をとっていてTIFF関係はTiffImagePlugin.pyが担当している 読み込みは単純にImage.open(ファイル名)で画像オブジェクトを作ってくれる。あとは他と一緒。 書き込みに関しては単体ならImage.save(ファイル名)でよい。圧縮形式を使いたかったら‘compression‘を追加する
マルチページの引数は下記の通りになる

Image.save("out.tif", compression='tiff_lzw',save_all=True, append_images=image_list[1:])

  • "out.tif" 出力するファイル名
  • compression='tiff_lzw' 圧縮形式
  • save_all=True 画像自身のマルチページも含めて全部保存
  • append_images=image_list[1:] 追加画像 追加なの初めの画像はインスタンス化した画像リストは2番目から指定してみた

当たり前だが、格納はインスタンスの画像、追加リストの頭から順番に格納される

エラーになった原因は、一部のTAG情報が未対応のため 主に、Photoshopのほうで独自に追加したTAGが原因だった。TAG読み込みは、問題ないが書き込みの際にエラーを出す 対応してないTAGを消していくことで何とか保存できた。

number tag name
34377 PhotoshopInfo
34665 ExifIFD
700 XMP

from PIL import Image, TiffImagePlugin

im0 = Image.open("f0.tif")
im1 = Image.open("f1.tif")
im2 = Image.open("f2.tif")
im3 = Image.open("f3.tif")

image_list = [im0,im1,im2,im3]

for obj in image_list :
    del obj.tag_v2[34377]
    del obj.tag_v2[34665]
    del obj.tag_v2[700]
im0.save("out.tif", compression='tiff_lzw',save_all=True, append_images=image_list[1:])

4ページの画像がつくられたことがわかる

im_mp = Image.open('out.tif')
for i in range(im_mp.n_frames):
    im_mp.seek(i)
    print(im_mp.tell()+1,"/",im_mp.n_frames,"pages",im_mp.tag_v2[306])
1 / 4 pages 2019:04:30 11:03:29
2 / 4 pages 2019:04:30 11:01:13
3 / 4 pages 2019:04:30 11:02:13
4 / 4 pages 2019:04:30 11:02:47

インスタンス画像4ページに新たに4ページ追加して合計8ページが作られた

im_mp.save("out2.tif", compression='tiff_lzw',save_all=True, append_images=image_list)
im_mp2 = Image.open('out2.tif')
for i in range(im_mp2.n_frames):
    im_mp2.seek(i)
    print(im_mp2.tell()+1,"/",im_mp2.n_frames,"pages",im_mp2.tag_v2[306])
1 / 8 pages 2019:04:30 11:03:29
2 / 8 pages 2019:04:30 11:01:13
3 / 8 pages 2019:04:30 11:02:13
4 / 8 pages 2019:04:30 11:02:47
5 / 8 pages 2019:04:30 11:03:29
6 / 8 pages 2019:04:30 11:01:13
7 / 8 pages 2019:04:30 11:02:13
8 / 8 pages 2019:04:30 11:02:47

対応している圧縮形式

圧縮形式を使うときはlibtiff が必要

print("認識している libtiff version = ",TiffImagePlugin._libtiff_version())
print("定義されている圧縮形式")
for k in TiffImagePlugin.COMPRESSION_INFO.keys():
    print(k,TiffImagePlugin.COMPRESSION_INFO[k])
認識している libtiff version =  4.0.10
定義されている圧縮形式
1 raw
2 tiff_ccitt
3 group3
4 group4
5 tiff_lzw
6 tiff_jpeg
7 jpeg
8 tiff_adobe_deflate
32771 tiff_raw_16
32773 packbits
32809 tiff_thunderscan
32946 tiff_deflate
34676 tiff_sgilog
34677 tiff_sgilog24

使用していたPhotoshopが吐き出したTAGデータ

from PIL import TiffTags
im = Image.open("f0.tif")
im_tag_v2 = im.tag_v2
for k in im_tag_v2.keys():
    print(k,TiffTags.TAGS_V2[k][1])
256 ImageWidth
257 ImageLength
258 BitsPerSample
259 Compression
262 PhotometricInterpretation
34377 PhotoshopInfo
273 StripOffsets
274 Orientation
277 SamplesPerPixel
278 RowsPerStrip
279 StripByteCounts
282 XResolution
283 YResolution
284 PlanarConfiguration
296 ResolutionUnit
34665 ExifIFD
305 Software
306 DateTime
34675 ICCProfile
700 XMP
317 Predictor
254 NewSubfileType

分かってしまえば簡単だが一から調べるのは時間がかかった。