Skip to content

Commit

Permalink
Merge pull request #2852 from wiredfool/issue_2837
Browse files Browse the repository at this point in the history
Fillcolor parameter for Transform
  • Loading branch information
wiredfool committed Dec 9, 2017
2 parents dcb8d6f + fa9e9c2 commit 588944c
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
15 changes: 10 additions & 5 deletions PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2074,7 +2074,8 @@ def thumbnail(self, size, resample=BICUBIC):

# FIXME: the different transform methods need further explanation
# instead of bloating the method docs, add a separate chapter.
def transform(self, size, method, data=None, resample=NEAREST, fill=1):
def transform(self, size, method, data=None, resample=NEAREST,
fill=1, fillcolor=None):
"""
Transforms this image. This method creates a new image with the
given size, and the same mode as the original, and copies data
Expand All @@ -2095,9 +2096,11 @@ def transform(self, size, method, data=None, resample=NEAREST, fill=1):
environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline
interpolation in a 4x4 environment). If omitted, or if the image
has mode "1" or "P", it is set to :py:attr:`PIL.Image.NEAREST`.
:param fillcolor: Optional fill color for the area outside the transform
in the output image.
:returns: An :py:class:`~PIL.Image.Image` object.
"""

if self.mode == 'LA':
return self.convert('La').transform(
size, method, data, resample, fill).convert('LA')
Expand All @@ -2116,13 +2119,15 @@ def transform(self, size, method, data=None, resample=NEAREST, fill=1):
if data is None:
raise ValueError("missing method data")

im = new(self.mode, size, None)
im = new(self.mode, size, fillcolor)
if method == MESH:
# list of quads
for box, quad in data:
im.__transformer(box, self, QUAD, quad, resample, fill)
im.__transformer(box, self, QUAD, quad, resample,
fillcolor is None)
else:
im.__transformer((0, 0)+size, self, method, data, resample, fill)
im.__transformer((0, 0)+size, self, method, data,
resample, fillcolor is None)

return im

Expand Down
12 changes: 11 additions & 1 deletion Tests/test_image_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ def test_quad(self):

self.assert_image_equal(transformed, scaled)

def test_fill(self):
im = hopper('RGB')
(w, h) = im.size
transformed = im.transform(im.size, Image.EXTENT,
(0, 0,
w*2, h*2),
Image.BILINEAR,
fillcolor = 'red')

self.assertEqual(transformed.getpixel((w-1,h-1)), (255,0,0))

def test_mesh(self):
# this should be a checkerboard of halfsized hoppers in ul, lr
im = hopper('RGBA')
Expand Down Expand Up @@ -256,6 +267,5 @@ class TestImageTransformPerspective(TestImageTransformAffine):
# Repeat all tests for AFFINE transformations with PERSPECTIVE
transform = Image.PERSPECTIVE


if __name__ == '__main__':
unittest.main()
4 changes: 2 additions & 2 deletions _imaging.c
Original file line number Diff line number Diff line change
Expand Up @@ -1612,7 +1612,7 @@ _transform2(ImagingObject* self, PyObject* args)
int fill = 1;
if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii",
&x0, &y0, &x1, &y1,
&Imaging_Type, &imagep,
&Imaging_Type, &imagep,
&method, &data,
&filter, &fill))
return NULL;
Expand All @@ -1637,7 +1637,7 @@ _transform2(ImagingObject* self, PyObject* args)

imOut = ImagingTransform(
self->image, imagep->image, method,
x0, y0, x1, y1, a, filter, 1);
x0, y0, x1, y1, a, filter, fill);

free(a);

Expand Down

0 comments on commit 588944c

Please sign in to comment.