Merge pull request #2883 from uploadcare/tiff-wrong-bitspersample

Fix count of BITSPERSAMPLE items in broken TIFF files
This commit is contained in:
wiredfool 2017-12-09 14:32:47 +00:00 committed by GitHub
commit 9ed4ea9e47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 5 deletions

View File

@ -1186,12 +1186,23 @@ class TiffImageFile(ImageFile.ImageFile):
# for more exotic images. # for more exotic images.
sampleFormat = (1,) 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 # mode: check photometric interpretation and bits per pixel
key = ( key = (self.tag_v2.prefix, photo, sampleFormat, fillorder,
self.tag_v2.prefix, photo, sampleFormat, fillorder, bps_tuple, extra_tuple)
self.tag_v2.get(BITSPERSAMPLE, (1,)),
self.tag_v2.get(EXTRASAMPLES, ())
)
if DEBUG: if DEBUG:
print("format key:", key) print("format key:", key)
try: try:

Binary file not shown.

View File

@ -59,6 +59,14 @@ class TestFileTiff(PillowTestCase):
self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 50, 'RGBa;16B')]) self.assertEqual(im.tile, [('tiff_lzw', (0, 0, 100, 40), 50, 'RGBa;16B')])
im.load() 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): def test_gimp_tiff(self):
# Read TIFF JPEG images from GIMP [@PIL168] # Read TIFF JPEG images from GIMP [@PIL168]