[Image-SIG] Using PIL to automatically trim borders from an image

Fredrik Lundh fredrik at pythonware.com
Sun Jul 20 13:02:41 CEST 2008


Matt Howell wrote:

> Is there a straightforward way to use PIL to trim off the borders of an 
> image?
> 
> I'm thinking of something equivalent to the trim() function in 
> ImageMagick.  It looks at the 4 corner pixels, figures out what color 
> the border is, and then trims out rows and columns from the image's 
> edges that match the border color.  So, as a use case, you could upload 
> an image with some arbitrary amount of whitespace around the main 
> content of the image, and trim out all that extra space.
> 
> I don't see any equivalent built-in functionality in the PIL 
> documentation -- crop() seems to come closest but it lacks the extra 
> logic needed.  I'm not opposed to writing the logic myself, but I'd like 
> to avoid reinventing the wheel, if I can. :)

there's no built-in function to do this, but it's fairly easy to do this 
by combining a few builtins; given an image and a border color, you can 
do something like:

     from PIL import ImageChops

     def trim(im, border):
         bg = Image.new(im.mode, im.size, border)
         diff = ImageChops.difference(im, bg)
         bbox = diff.getbbox()
         if bbox:
             return im.crop(bbox)
         else:
             # found no content
             raise ValueError("cannot trim; image was empty")

for details, see:

     http://effbot.org/tag/PIL.ImageChops.difference
     http://effbot.org/tag/PIL.Image.Image.getbbox

(adding a color argument to getbbox could be pretty useful, I think)

writing code to determine a suitable border color (e.g. by inspecting 
the corners or the border row/columns) is left as an exercise.

</F>



More information about the Image-SIG mailing list