diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index b9dd19a61..43ffd1b4f 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -1186,12 +1186,23 @@ class TiffImageFile(ImageFile.ImageFile): # for more exotic images. sampleFormat = (1,) + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + bps_count += len(extra_tuple) + # Some files have only one value in bps_tuple, + # while should have more. Fix it + if bps_count > len(bps_tuple) and len(bps_tuple) == 1: + bps_tuple = bps_tuple * bps_count + # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, photo, sampleFormat, fillorder, - self.tag_v2.get(BITSPERSAMPLE, (1,)), - self.tag_v2.get(EXTRASAMPLES, ()) - ) + key = (self.tag_v2.prefix, photo, sampleFormat, fillorder, + bps_tuple, extra_tuple) if DEBUG: print("format key:", key) try: diff --git a/Tests/images/tiff_wrong_bits_per_sample.tiff b/Tests/images/tiff_wrong_bits_per_sample.tiff new file mode 100644 index 000000000..554d4b351 Binary files /dev/null and b/Tests/images/tiff_wrong_bits_per_sample.tiff differ diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 1eb784dfb..d0aaef698 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -59,6 +59,14 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 50, 'RGBa;16B')]) im.load() + def test_wrong_bits_per_sample(self): + im = Image.open("Tests/images/tiff_wrong_bits_per_sample.tiff") + + self.assertEqual(im.mode, "RGBA") + self.assertEqual(im.size, (52, 53)) + self.assertEqual(im.tile, [('raw', (0, 0, 52, 53), 160, ('RGBA', 0, 1))]) + im.load() + def test_gimp_tiff(self): # Read TIFF JPEG images from GIMP [@PIL168]