[Image-SIG] ImageOps.fit(): cropping area wrong (too small by 1 px) (PIL 1.1.7)

Olaf Dietrich olaf at dtrx.de
Tue Aug 3 12:57:21 CEST 2010

Apparently, the cropping area is miscalculated in the
ImageOps.fit() function in PIL 1.1.7:

Calling fit() with bleed=0.0 should return an image without
any removed border:

# @param bleed Remove a border around the outside of the image (from all
#     four edges.  The value is a decimal percentage (use 0.01 for one
#     percent).  The default value is 0 (no border).

However, the returned image after the internal call of crop,
i.e. after the lines

    out = image.crop(
        (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight)

is in fact cropped: 1 column/row of pixels is removed at the
right hand side and at the bottom, i.e. if we start with
a 100×100 pixel image and call ImageOps.fit() without
the bleed and centering parameters (or with bleed=0.0):

	print "before image.crop:", image.size
    out = image.crop(
        (leftSide, topSide, leftSide + cropWidth, topSide + cropHeight)
	print "after image.crop:", out.size

this results in:

| before image.crop: (100, 100)
| after image.crop: (99, 99)

If I assume that the convention in ImageOps.crop() is correct,

    left, top, right, bottom = _border(border)
    return image.crop(
        (left, top, image.size[0]-right, image.size[1]-bottom)

then crop should be called with the arguments "0 0 size[0] size[1]"
if NO cropping is intended. This means that EITHER already the
definition of liveArea (in ImageOps.fit()) should be changed from:

    liveArea = (
        bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0] - 1,
        image.size[1] - bleedPixels[1] - 1
    liveArea = (
        bleedPixels[0], bleedPixels[1], image.size[0] - bleedPixels[0],
        image.size[1] - bleedPixels[1]

OR the definition of liveSize should be change from

    liveSize = (liveArea[2] - liveArea[0], liveArea[3] - liveArea[1])
    liveSize = (liveArea[2] - liveArea[0] + 1, liveArea[3] - liveArea[1] + 1)

OR cropWidth and cropHeight should be defined as

        cropHeight = liveSize[1] + 1
        cropWidth = liveSize[0] + 1

This problem is independent of the one concerning the
centering parameter that I described in my message from 30 July.

Best regards

More information about the Image-SIG mailing list