Обрезка изображения в центре с помощью PIL

Как обрезать изображение в центре? Потому что я знаю, что поле-это 4-кортеж, определяющий левую, верхнюю, правую и нижнюю пиксельную координату, но я не знаю, как получить эти координаты, чтобы он обрезался в центре.

3 ответов


предполагая, что вы знаете размер, который вы хотели бы обрезать (new_width X new_height):

import Image
im = Image.open(<your image>)
width, height = im.size   # Get dimensions

left = (width - new_width)/2
top = (height - new_height)/2
right = (width + new_width)/2
bottom = (height + new_height)/2

im.crop((left, top, right, bottom))

это сломается, если вы попытаетесь обрезать небольшое изображение больше, но я собираюсь предположить, что вы не будете пытаться это (или что вы можете поймать этот случай и не обрезать изображение).


одна потенциальная проблема с предлагаемым решением заключается в том, что существует нечетная разница между желаемым размером и старым размером. Нельзя иметь по полпикселя с каждой стороны. Нужно выбрать сторону, чтобы поставить дополнительный пиксель.

Если есть нечетная разница для горизонтали, код ниже поместит дополнительный пиксель вправо, а если есть и нечетная разница по вертикали, дополнительный пиксель пойдет вниз.

import numpy as np

def centeredCrop(img, new_height, new_width):

   width =  np.size(img,1)
   height =  np.size(img,0)

   left = np.ceil((width - new_width)/2.)
   top = np.ceil((height - new_height)/2.)
   right = np.floor((width + new_width)/2.)
   bottom = np.floor((height + new_height)/2.)
   cImg = img[top:bottom, left:right]
   return cImg

это функция, которую я искал:

from PIL import Image
im = Image.open("test.jpg")

crop_rectangle = (50, 50, 200, 200)
cropped_im = im.crop(crop_rectangle)

cropped_im.show()

принято от еще один ответ