web-dev-qa-db-fra.com

Recadrer une image au centre à l'aide de PIL

Comment recadrer une image au centre? Parce que je sais que la boîte est un quadruple définissant les coordonnées des pixels gauche, supérieur, droit et inférieur, mais je ne sais pas comment obtenir ces coordonnées afin qu'elles recadrent au centre.

19
user2401069

En supposant que vous connaissez la taille à laquelle vous souhaitez recadrer (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

# Crop the center of the image
im = im.crop((left, top, right, bottom))

Cela se cassera si vous essayez de recadrer une petite image plus grande, mais je suppose que vous n'essaierez pas cela (ou que vous pouvez attraper ce cas et ne pas recadrer l'image).

56
Chris Clarke

Un problème potentiel avec la solution proposée est dans le cas où il y a une différence étrange entre la taille souhaitée et l'ancienne taille. Vous ne pouvez pas avoir un demi-pixel de chaque côté. Il faut choisir un côté pour mettre un pixel supplémentaire.

S'il y a une différence étrange pour l'horizontale, le code ci-dessous mettra le pixel supplémentaire à droite, et s'il y a une différence étrange sur la verticale, le pixel supplémentaire va vers le bas.

import numpy as np

def center_crop(img, new_width=None, new_height=None):        

    width = img.shape[1]
    height = img.shape[0]

    if new_width is None:
        new_width = min(width, height)

    if new_height is None:
        new_height = min(width, height)

    left = int(np.ceil((width - new_width) / 2))
    right = width - int(np.floor((width - new_width) / 2))

    top = int(np.ceil((height - new_height) / 2))
    bottom = height - int(np.floor((height - new_height) / 2))

    if len(img.shape) == 2:
        center_cropped_img = img[top:bottom, left:right]
    else:
        center_cropped_img = img[top:bottom, left:right, ...]

    return center_cropped_img
7
Dean Pospisil

C'est la fonction que je cherchais:

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

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

cropped_im.show()

Tiré de ne autre réponse

3
penduDev