diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index 6a52e5e5c..ae7d56947 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -54,6 +54,7 @@ import sys import collections import itertools import os +import io # Set these to true to force use of libtiff for reading or writing. READ_LIBTIFF = False @@ -1128,8 +1129,11 @@ def _save(im, fp, filename): print (ifd.items()) _fp = 0 if hasattr(fp, "fileno"): - fp.seek(0) - _fp = os.dup(fp.fileno()) + try: + fp.seek(0) + _fp = os.dup(fp.fileno()) + except io.UnsupportedOperation: + pass # ICC Profile crashes. blocklist = [STRIPOFFSETS, STRIPBYTECOUNTS, ROWSPERSTRIP, ICCPROFILE] diff --git a/Tests/test_file_libtiff.py b/Tests/test_file_libtiff.py index efd2d5817..12f25165f 100644 --- a/Tests/test_file_libtiff.py +++ b/Tests/test_file_libtiff.py @@ -1,6 +1,7 @@ from helper import unittest, PillowTestCase, hopper, py3 import os +import io from PIL import Image, TiffImagePlugin @@ -59,9 +60,8 @@ class TestFileLibTiff(LibTiffTestCase): def test_g4_tiff_bytesio(self): """Testing the stringio loading code path""" - from io import BytesIO file = "Tests/images/hopper_g4_500.tif" - s = BytesIO() + s = io.BytesIO() with open(file, 'rb') as f: s.write(f.read()) s.seek(0) @@ -357,6 +357,34 @@ class TestFileLibTiff(LibTiffTestCase): self.assertEqual(im.mode, "L") self.assert_image_similar(im, original, 7.3) + def test_save_bytesio(self): + # PR 1011 + # Test TIFF saving to io.BytesIO() object. + + TiffImagePlugin.WRITE_LIBTIFF = True + TiffImagePlugin.READ_LIBTIFF = True + + # Generate test image + pilim = hopper() + + def save_bytesio(compression=None): + + testfile = self.tempfile("temp_.tiff".format(compression)) + + buffer_io = io.BytesIO() + pilim.save(buffer_io, format="tiff", compression=compression) + buffer_io.seek(0) + + pilim_load = Image.open(buffer_io) + self.assert_image_similar(pilim, pilim_load, 0) + + # save_bytesio() + save_bytesio('raw') + save_bytesio("packbits") + save_bytesio("tiff_lzw") + + TiffImagePlugin.WRITE_LIBTIFF = False + TiffImagePlugin.READ_LIBTIFF = False diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 3939ac074..fd8090196 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -326,7 +326,7 @@ class TestFileTiff(PillowTestCase): # Should not divide by zero im.save(outfile) - + if __name__ == '__main__': unittest.main()