2013-05-20 2 views
10

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

+0

вы знаете размер изображения и размер меньшего изображения, которое вы хотите получить, я предполагать? У вас есть что показать, где вы пытались? –

ответ

29

Предполагая, что вы знаете размер вы хотите обрезать, чтобы (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)) 

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

+0

Хорошо, наконец, это получилось! Спасибо, кучи. – user2401069

+0

Небольшая коррекция, обрезка принимает массив. im.crop ((слева, сверху, справа, внизу)) – freakTheMighty

+0

Nitpick: Вы имеете в виду последовательность, а не массив. :) – EOL

3

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

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

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 
+3

Неверное округление, изображение результата не всегда будет иметь требуемые размеры. Правильная формула: 'right = width - floor ((width - new_width)/2)' –

2

Это функция Я искал:

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

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

cropped_im.show() 

Взято из another answer