mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 01:47:47 +03:00 
			
		
		
		
	Merge pull request #2852 from wiredfool/issue_2837
Fillcolor parameter for Transform
This commit is contained in:
		
						commit
						588944c4a8
					
				
							
								
								
									
										15
									
								
								PIL/Image.py
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								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,9 +2096,11 @@ 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.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        if self.mode == 'LA':
 | 
					        if self.mode == 'LA':
 | 
				
			||||||
            return self.convert('La').transform(
 | 
					            return self.convert('La').transform(
 | 
				
			||||||
                size, method, data, resample, fill).convert('LA')
 | 
					                size, method, data, resample, fill).convert('LA')
 | 
				
			||||||
| 
						 | 
					@ -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