2013-05-20 48 views
10

Làm cách nào để cắt ảnh ở trung tâm? Bởi vì tôi biết rằng hộp là 4-tuple xác định tọa độ pixel trái, trên, phải và dưới nhưng tôi không biết cách lấy các tọa độ này để nó có thể canh tác ở giữa.Cắt ảnh ở trung tâm bằng cách sử dụng PIL

+0

bạn không biết kích thước của hình ảnh và kích thước của hình ảnh nhỏ hơn bạn muốn nhận được, tôi giả định? Bạn có bất cứ điều gì để hiển thị nơi bạn đã thử không? –

Trả lời

29

Giả sử bạn biết kích thước mà bạn muốn cắt đến (new_height X new_width):

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

này sẽ phá vỡ nếu bạn cố gắng để cắt một hình ảnh nhỏ lớn hơn, nhưng tôi sẽ giả sử bạn thắng không cố gắng (Hoặc bạn có thể nắm bắt trường hợp đó và không cắt hình ảnh).

+0

Được rồi cuối cùng đã làm cho nó hoạt động! Cảm ơn đống. – user2401069

+0

Chỉnh nhỏ, cây trồng mất một mảng. im.crop ((trái, trên, phải, dưới)) – freakTheMighty

+0

Nitpick: Bạn ngụ ý một chuỗi, không phải mảng. :) – EOL

3

Một vấn đề tiềm ẩn với giải pháp được đề xuất là trong trường hợp có sự khác biệt kỳ lạ giữa kích thước mong muốn và kích thước cũ. Bạn không thể có một nửa pixel ở mỗi bên. Người ta phải chọn một bên để đặt thêm một pixel trên.

Nếu có sự khác biệt kỳ lạ đối với chiều ngang, mã bên dưới sẽ đặt thêm pixel ở bên phải, và nếu có và khác biệt lẻ trên điểm ảnh, điểm ảnh sẽ chuyển xuống dưới cùng.

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

làm tròn không chính xác, hình ảnh kết quả sẽ không phải lúc nào cũng có kích thước được yêu cầu. Công thức đúng là 'right = width - floor ((width - new_width)/2)' –

2

Đây là chức năng tôi đang tìm kiếm:

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

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

cropped_im.show() 

Taken từ another answer