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>

_______________________________________________
Image-SIG maillist  -  Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig

Reply via email to