Merge pull request #3479 from radarhere/gif_extension

Allow arbitrary number of comment extension subblocks
This commit is contained in:
Hugo 2018-12-04 23:09:59 +02:00 committed by GitHub
commit a4fccd3dde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 6 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -435,6 +435,23 @@ class TestFileGif(PillowTestCase):
self.assertEqual(reread.info['comment'], im.info['comment']) self.assertEqual(reread.info['comment'], im.info['comment'])
def test_comment_over_255(self):
out = self.tempfile('temp.gif')
im = Image.new('L', (100, 100), '#000')
comment = b"Test comment text"
while len(comment) < 256:
comment += comment
im.info['comment'] = comment
im.save(out)
reread = Image.open(out)
self.assertEqual(reread.info['comment'], comment)
def test_zero_comment_subblocks(self):
im = Image.open('Tests/images/hopper_zero_comment_subblocks.gif')
expected = Image.open(TEST_GIF)
self.assert_image_equal(im, expected)
def test_version(self): def test_version(self):
out = self.tempfile('temp.gif') out = self.tempfile('temp.gif')

View File

@ -201,7 +201,13 @@ class GifImageFile(ImageFile.ImageFile):
# #
# comment extension # comment extension
# #
info["comment"] = block while block:
if "comment" in info:
info["comment"] += block
else:
info["comment"] = block
block = self.data()
continue
elif i8(s) == 255: elif i8(s) == 255:
# #
# application extension # application extension
@ -536,12 +542,14 @@ def _write_local_header(fp, im, offset, flags):
o8(0)) o8(0))
if "comment" in im.encoderinfo and \ if "comment" in im.encoderinfo and \
1 <= len(im.encoderinfo["comment"]) <= 255: 1 <= len(im.encoderinfo["comment"]):
fp.write(b"!" + fp.write(b"!" +
o8(254) + # extension intro o8(254)) # extension intro
o8(len(im.encoderinfo["comment"])) + for i in range(0, len(im.encoderinfo["comment"]), 255):
im.encoderinfo["comment"] + subblock = im.encoderinfo["comment"][i:i+255]
o8(0)) fp.write(o8(len(subblock)) +
subblock)
fp.write(o8(0))
if "loop" in im.encoderinfo: if "loop" in im.encoderinfo:
number_of_loops = im.encoderinfo["loop"] number_of_loops = im.encoderinfo["loop"]
fp.write(b"!" + fp.write(b"!" +