From 4b6fb417a060ffbdc3b0dd3ca75baac3ad43d425 Mon Sep 17 00:00:00 2001 From: Leonid Bloch Date: Thu, 16 Feb 2017 02:54:43 +0200 Subject: [PATCH] Allow to save tiff stacks from separate images This is a quick solution that will allow to save tiff stacks from separate images, e.g. from Numpy arrays. Previously, tiff stacks could be saved only from multiframe images. This behavior is similar to what is possible now with GIFs. Example: import numpy as np from PIL import Image a = np.ones((100,100,100), dtype=np.uint8) imlist = [] for m in a: imlist.append(Image.fromarray(m)) imlist[0].save("test.tif", compression="tiff_deflate", save_all=True, append_images=imlist[1:]) (Should result in a 100-frame, 100x100 tiff stack.) Signed-off-by: Leonid Bloch --- PIL/TiffImagePlugin.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 505025bb8..ede267c43 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1737,17 +1737,28 @@ class AppendingTiffWriter: self.rewriteLastLong(offset) def _save_all(im, fp, filename): - if not hasattr(im, "n_frames"): + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = encoderinfo.get("append_images", []) + if not hasattr(im, "n_frames") and not len(append_images): return _save(im, fp, filename) cur_idx = im.tell() try: with AppendingTiffWriter(fp) as tf: - for idx in range(im.n_frames): - im.seek(idx) - im.load() - _save(im, tf, filename) - tf.newFrame() + for ims in [im]+append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() finally: im.seek(cur_idx)