mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-27 10:26:19 +03:00
Merge pull request #2883 from uploadcare/tiff-wrong-bitspersample
Fix count of BITSPERSAMPLE items in broken TIFF files
This commit is contained in:
commit
9ed4ea9e47
|
@ -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:
|
||||||
|
|
BIN
Tests/images/tiff_wrong_bits_per_sample.tiff
Normal file
BIN
Tests/images/tiff_wrong_bits_per_sample.tiff
Normal file
Binary file not shown.
|
@ -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]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user