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

StackOverflow https://stackoverflow.com/questions/3873859

Вопрос

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

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")

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

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

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

Это было полезно?

Решение

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

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 dimensions
          thumbwidth,thumbheight are thumbnail image 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 use half the size difference of the image and the crop area
    dx = (imagewidth-cropwidth)/2
    dy = (imageheight-cropheight)/2

    # return bounding box of centered crop area on source image
    return dx,dy, cropwidth+dx,cropheight+dy


if __name__=='__main__':

    print("===")
    bbox = cropbbox(1024,768, 128,128)
    print("cropbbox(1024,768, 128,128): {}".format(bbox))

    print("===")
    bbox = cropbbox(768,1024, 128,128)
    print("cropbbox(768,1024, 128,128): {}".format(bbox))

    print("===")
    bbox = cropbbox(1024,1024, 96,128)
    print("cropbbox(1024,1024, 96,128): {}".format(bbox))

    print("===")
    bbox = cropbbox(1024,1024, 128,96)
    print("cropbbox(1024,1024, 128,96): {}".format(bbox))

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top