Merge pull request #5304 from nulano/5300

Do not premultiply alpha when resizing with Image.NEAREST resampling
This commit is contained in:
Andrew Murray 2021-03-28 16:02:01 +11:00 committed by GitHub
commit f799915d6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 3 deletions

View File

@ -143,6 +143,41 @@ class TestImageTransform:
self._test_alpha_premult(op) self._test_alpha_premult(op)
def _test_nearest(self, op, mode):
# create white image with half transparent,
# do op,
# the image should remain white with half transparent
transparent, opaque = {
"RGBA": ((255, 255, 255, 0), (255, 255, 255, 255)),
"LA": ((255, 0), (255, 255)),
}[mode]
im = Image.new(mode, (10, 10), transparent)
im2 = Image.new(mode, (5, 10), opaque)
im.paste(im2, (0, 0))
im = op(im, (40, 10))
colors = im.getcolors()
assert colors == [
(20 * 10, opaque),
(20 * 10, transparent),
]
@pytest.mark.parametrize("mode", ("RGBA", "LA"))
def test_nearest_resize(self, mode):
def op(im, sz):
return im.resize(sz, Image.NEAREST)
self._test_nearest(op, mode)
@pytest.mark.parametrize("mode", ("RGBA", "LA"))
def test_nearest_transform(self, mode):
def op(im, sz):
(w, h) = im.size
return im.transform(sz, Image.EXTENT, (0, 0, w, h), Image.NEAREST)
self._test_nearest(op, mode)
def test_blank_fill(self): def test_blank_fill(self):
# attempting to hit # attempting to hit
# https://github.com/python-pillow/Pillow/issues/254 reported # https://github.com/python-pillow/Pillow/issues/254 reported

View File

@ -1916,7 +1916,7 @@ class Image:
if self.mode in ("1", "P"): if self.mode in ("1", "P"):
resample = NEAREST resample = NEAREST
if self.mode in ["LA", "RGBA"]: if self.mode in ["LA", "RGBA"] and resample != NEAREST:
im = self.convert(self.mode[:-1] + "a") im = self.convert(self.mode[:-1] + "a")
im = im.resize(size, resample, box) im = im.resize(size, resample, box)
return im.convert(self.mode) return im.convert(self.mode)
@ -2400,14 +2400,14 @@ class Image:
:returns: An :py:class:`~PIL.Image.Image` object. :returns: An :py:class:`~PIL.Image.Image` object.
""" """
if self.mode == "LA": if self.mode == "LA" and resample != NEAREST:
return ( return (
self.convert("La") self.convert("La")
.transform(size, method, data, resample, fill, fillcolor) .transform(size, method, data, resample, fill, fillcolor)
.convert("LA") .convert("LA")
) )
if self.mode == "RGBA": if self.mode == "RGBA" and resample != NEAREST:
return ( return (
self.convert("RGBa") self.convert("RGBa")
.transform(size, method, data, resample, fill, fillcolor) .transform(size, method, data, resample, fill, fillcolor)