Каков самый простой способ в 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")
Где файл может быть задан и изменен.
Текущая функция работает отлично, за исключением того, что она не обрезает, когда это необходимо.
В случае, если задано прямоугольное изображение и требуется Квадратный Размер (ширина = высота), необходимо выполнить некоторую центрированную взвешенную обрезку.
Как я могу это сделать?
Спасибо!
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