Merge pull request #2852 from wiredfool/issue_2837

Fillcolor parameter for Transform
This commit is contained in:
wiredfool 2017-12-09 14:15:41 +00:00 committed by GitHub
commit 588944c4a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 8 deletions

View File

@ -2074,7 +2074,8 @@ class Image(object):
# FIXME: the different transform methods need further explanation # FIXME: the different transform methods need further explanation
# instead of bloating the method docs, add a separate chapter. # 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 Transforms this image. This method creates a new image with the
given size, and the same mode as the original, and copies data given size, and the same mode as the original, and copies data
@ -2095,6 +2096,8 @@ class Image(object):
environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline environment), or :py:attr:`PIL.Image.BICUBIC` (cubic spline
interpolation in a 4x4 environment). If omitted, or if the image 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`. 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. :returns: An :py:class:`~PIL.Image.Image` object.
""" """
@ -2116,13 +2119,15 @@ class Image(object):
if data is None: if data is None:
raise ValueError("missing method data") raise ValueError("missing method data")
im = new(self.mode, size, None) im = new(self.mode, size, fillcolor)
if method == MESH: if method == MESH:
# list of quads # list of quads
for box, quad in data: for box, quad in data:
im.__transformer(box, self, QUAD, quad, resample, fill) im.__transformer(box, self, QUAD, quad, resample,
fillcolor is None)
else: 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 return im

View File

@ -52,6 +52,17 @@ class TestImageTransform(PillowTestCase):
self.assert_image_equal(transformed, scaled) 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): def test_mesh(self):
# this should be a checkerboard of halfsized hoppers in ul, lr # this should be a checkerboard of halfsized hoppers in ul, lr
im = hopper('RGBA') im = hopper('RGBA')
@ -256,6 +267,5 @@ class TestImageTransformPerspective(TestImageTransformAffine):
# Repeat all tests for AFFINE transformations with PERSPECTIVE # Repeat all tests for AFFINE transformations with PERSPECTIVE
transform = Image.PERSPECTIVE transform = Image.PERSPECTIVE
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -1637,7 +1637,7 @@ _transform2(ImagingObject* self, PyObject* args)
imOut = ImagingTransform( imOut = ImagingTransform(
self->image, imagep->image, method, self->image, imagep->image, method,
x0, y0, x1, y1, a, filter, 1); x0, y0, x1, y1, a, filter, fill);
free(a); free(a);