Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fillcolor parameter for Transform #2852

Merged
merged 4 commits into from
Dec 9, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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