mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-24 17:06:16 +03:00
Adjust buffer size when icc_profile > MAXBLOCK (issue #148)
We were encountering some errors when saving specific JPEG images. The error was shown in stderr as: IOError: encoder error -2 when writing image file And on stdout it printed: Suspension not allowed here The problem was the bufsize not contemplating the icc_profile block.
This commit is contained in:
parent
633d751bdc
commit
ebaa509d66
|
@ -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)
|
||||
|
||||
|
|
BIN
Tests/images/icc_profile_big.jpg
Normal file
BIN
Tests/images/icc_profile_big.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 500 KiB |
|
@ -133,6 +133,21 @@ 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 biger 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)
|
||||
assert True
|
||||
except IOError:
|
||||
assert False, "Failed saving image with icc larger than image size"
|
||||
|
||||
|
||||
def test_optimize(self):
|
||||
im1 = self.roundtrip(hopper())
|
||||
im2 = self.roundtrip(hopper(), optimize=0)
|
||||
|
|
Loading…
Reference in New Issue
Block a user