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