From b6b362c80718eeee122e9d346758d18335d66b2a Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Jun 2021 21:21:38 +1000 Subject: [PATCH] Set color after attaching palette in expand() --- Tests/test_imageops.py | 13 ++++++++++--- src/PIL/ImageOps.py | 13 ++++++++++--- src/PIL/ImagePalette.py | 10 ++++++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index 31725581f..acd20bb58 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -157,9 +157,16 @@ def test_scale(): def test_expand_palette(): - im = Image.open("Tests/images/hopper.gif") - im_expanded = ImageOps.expand(im) - assert_image_equal(im_expanded.convert("RGB"), im.convert("RGB")) + im = Image.open("Tests/images/p_16.tga") + im_expanded = ImageOps.expand(im, 10, (255, 0, 0)) + + px = im_expanded.convert("RGB").load() + assert px[0, 0] == (255, 0, 0) + + im_cropped = im_expanded.crop( + (10, 10, im_expanded.width - 10, im_expanded.height - 10) + ) + assert_image_equal(im_cropped, im) def test_colorize_2color(): diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index ad07fcedb..98be4bb91 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -20,7 +20,7 @@ import functools import operator -from . import Image +from . import Image, ImageDraw # # helpers @@ -392,10 +392,17 @@ def expand(image, border=0, fill=0): left, top, right, bottom = _border(border) width = left + image.size[0] + right height = top + image.size[1] + bottom - out = Image.new(image.mode, (width, height), _color(fill, image.mode)) + color = _color(fill, image.mode) if image.mode == "P" and image.palette: + out = Image.new(image.mode, (width, height)) out.putpalette(image.palette) - out.paste(image, (left, top)) + out.paste(image, (left, top)) + + draw = ImageDraw.Draw(out) + draw.rectangle((0, 0, width, height), outline=color, width=border) + else: + out = Image.new(image.mode, (width, height), color) + out.paste(image, (left, top)) return out diff --git a/src/PIL/ImagePalette.py b/src/PIL/ImagePalette.py index f425a3c30..84dbeef02 100644 --- a/src/PIL/ImagePalette.py +++ b/src/PIL/ImagePalette.py @@ -115,7 +115,7 @@ class ImagePalette: return self.colors[color] except KeyError as e: # allocate new color slot - if isinstance(self.palette, bytes): + if not isinstance(self.palette, bytearray): self._palette = bytearray(self.palette) index = len(self.palette) // 3 if index >= 256: @@ -129,9 +129,11 @@ class ImagePalette: raise ValueError("cannot allocate more than 256 colors") from e self.colors[color] = index if index * 3 < len(self.palette): - self._palette[index * 3] = color[0] - self._palette[index * 3 + 1] = color[1] - self._palette[index * 3 + 2] = color[2] + self._palette = ( + self.palette[: index * 3] + + bytes(color) + + self.palette[index * 3 + 3 :] + ) else: self._palette += bytes(color) self.dirty = 1