Каков самый простой способ в Python изменить размер изображения до заданной ограниченной области?



Я хотел бы создать функцию, например:



def generateThumbnail(self, width, height):
"""
Generates thumbnails for an image
"""
im = Image.open(self._file)
im.thumbnail((width, height), Image.ANTIALIAS)
im.save(self._path + str(width) + 'x' +
str(height) + '-' + self._filename, "JPEG")


Где файл может быть задан и изменен.



Текущая функция работает отлично, за исключением того, что она не обрезает, когда это необходимо.



В случае, если задано прямоугольное изображение и требуется Квадратный Размер (ширина = высота), необходимо выполнить некоторую центрированную взвешенную обрезку.



Как я могу это сделать?



Спасибо!

663   1  

1 ответ:

Перед изменением размера изображения его необходимо правильно обрезать. Основная идея заключается в том, чтобы определить самую большую прямоугольную область исходного изображения, имеющую такое же соотношение сторон (ширина к высоте), как и изображение миниатюры, а затем обрезать (обрезать) любые излишки вокруг него, прежде чем изменять размеры миниатюры). Вот функция, которая вычислит размер и расположение такой области обрезки:

def cropbbox(imagewidth, imageheight, thumbwidth, thumbheight):
    """ cropbbox(imagewidth, imageheight, thumbwidth, thumbheight)

        Compute a centered image crop area for making thumbnail images.
          imagewidth, imageheight are source image's dimensions
          thumbwidth, thumbheight are thumbnail image's dimensions

        Returns bounding box pixel coordinates of the cropping area
        in this order (left, upper, right, lower).
    """
    # determine scale factor
    fx = float(imagewidth)/thumbwidth
    fy = float(imageheight)/thumbheight
    f = fx if fx < fy else fy

    # calculate size of crop area
    cropheight, cropwidth = int(thumbheight*f), int(thumbwidth*f)

    # for centering compute half the size difference of the image & crop area
    dx = (imagewidth-cropwidth)/2
    dy = (imageheight-cropheight)/2

    # return bounding box of crop area
    return dx, dy, dx+cropwidth, dy+cropheight

if __name__=='__main__':

    print "==="
    bbox = cropbbox(1024, 768, 128, 128)
    print "cropbbox(1024, 768, 128, 128):", bbox

    print "==="
    bbox = cropbbox(768, 1024, 128, 128)
    print "cropbbox(768, 1024, 128, 128):", bbox

    print "==="
    bbox = cropbbox(1024, 1024, 96, 128)
    print "cropbbox(1024, 1024, 96, 128):", bbox

    print "==="
    bbox = cropbbox(1024, 1024, 128, 96)
    print "cropbbox(1024, 1024, 128, 96):", bbox

После определения области обрезки вызовите im.crop(bbox) , а затем вызовите im.thumbnail(...) на изображении возвращенный.

Comments

    Ничего не найдено.