diff --git a/PIL/Image.py b/PIL/Image.py index 70a8582f605..0ff3c8a8045 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -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 @@ -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') @@ -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 diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index e03cfe24a51..df8fc83e84a 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -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') @@ -256,6 +267,5 @@ class TestImageTransformPerspective(TestImageTransformAffine): # Repeat all tests for AFFINE transformations with PERSPECTIVE transform = Image.PERSPECTIVE - if __name__ == '__main__': unittest.main() diff --git a/_imaging.c b/_imaging.c index 8abb7afa838..44eb2dbb7b2 100644 --- a/_imaging.c +++ b/_imaging.c @@ -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; @@ -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);