mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-10 16:22:22 +03:00
Merge pull request #2852 from wiredfool/issue_2837
Fillcolor parameter for Transform
This commit is contained in:
commit
588944c4a8
13
PIL/Image.py
13
PIL/Image.py
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -1612,7 +1612,7 @@ _transform2(ImagingObject* self, PyObject* args)
|
||||||
int fill = 1;
|
int fill = 1;
|
||||||
if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii",
|
if (!PyArg_ParseTuple(args, "(iiii)O!iO|ii",
|
||||||
&x0, &y0, &x1, &y1,
|
&x0, &y0, &x1, &y1,
|
||||||
&Imaging_Type, &imagep,
|
&Imaging_Type, &imagep,
|
||||||
&method, &data,
|
&method, &data,
|
||||||
&filter, &fill))
|
&filter, &fill))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user