Merge pull request #7493 from radarhere/frombytes

Fixed frombytes() for images with a zero dimension
This commit is contained in:
Andrew Murray 2023-11-03 18:56:34 +11:00 committed by GitHub
commit a5a6ca150c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 8 deletions

View File

@ -906,6 +906,13 @@ class TestImage:
im = Image.new("RGB", size) im = Image.new("RGB", size)
assert im.tobytes() == b"" assert im.tobytes() == b""
@pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0)))
def test_zero_frombytes(self, size):
Image.frombytes("RGB", size, b"")
im = Image.new("RGB", size)
im.frombytes(b"")
def test_has_transparency_data(self): def test_has_transparency_data(self):
for mode in ("1", "L", "P", "RGB"): for mode in ("1", "L", "P", "RGB"):
im = Image.new(mode, (1, 1)) im = Image.new(mode, (1, 1))

View File

@ -791,6 +791,9 @@ class Image:
but loads data into this image instead of creating a new image object. but loads data into this image instead of creating a new image object.
""" """
if self.width == 0 or self.height == 0:
return
# may pass tuple instead of argument list # may pass tuple instead of argument list
if len(args) == 1 and isinstance(args[0], tuple): if len(args) == 1 and isinstance(args[0], tuple):
args = args[0] args = args[0]
@ -2967,15 +2970,16 @@ def frombytes(mode, size, data, decoder_name="raw", *args):
_check_size(size) _check_size(size)
# may pass tuple instead of argument list
if len(args) == 1 and isinstance(args[0], tuple):
args = args[0]
if decoder_name == "raw" and args == ():
args = mode
im = new(mode, size) im = new(mode, size)
im.frombytes(data, decoder_name, args) if im.width != 0 and im.height != 0:
# may pass tuple instead of argument list
if len(args) == 1 and isinstance(args[0], tuple):
args = args[0]
if decoder_name == "raw" and args == ():
args = mode
im.frombytes(data, decoder_name, args)
return im return im