diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 8890ed9ee..ee29a8add 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -732,8 +732,9 @@ def _save(im, fp, filename): bufsize = im.size[0] * im.size[1] # The exif info needs to be written as one block, + APP1, + one spare byte. - # Ensure that our buffer is big enough - bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5) + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(ImageFile.MAXBLOCK, bufsize, len(info.get("exif", b"")) + 5, + len(extra) + 1) ImageFile._save(im, fp, [("jpeg", (0, 0)+im.size, 0, rawmode)], bufsize) diff --git a/Tests/images/icc_profile_big.jpg b/Tests/images/icc_profile_big.jpg new file mode 100644 index 000000000..adf98beaa Binary files /dev/null and b/Tests/images/icc_profile_big.jpg differ diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 6858e52f5..1d189e680 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -133,6 +133,19 @@ class TestFileJpeg(PillowTestCase): test(ImageFile.MAXBLOCK+1) # full buffer block plus one byte test(ImageFile.MAXBLOCK*4+3) # large block + def test_large_icc_meta(self): + # https://github.com/python-pillow/Pillow/issues/148 + # Sometimes the meta data on the icc_profile block is bigger than + # Image.MAXBLOCK or the image size. + im = Image.open('Tests/images/icc_profile_big.jpg') + f = self.tempfile("temp.jpg") + icc_profile = im.info["icc_profile"] + try: + im.save(f, format='JPEG', progressive=True,quality=95, + icc_profile=icc_profile, optimize=True) + except IOError: + self.fail("Failed saving image with icc larger than image size") + def test_optimize(self): im1 = self.roundtrip(hopper()) im2 = self.roundtrip(hopper(), optimize=0)