¿Cómo recortar una imagen usando PIL?

134

Quiero recortar la imagen en el camino eliminando las primeras 30 filas y las últimas 30 filas de la imagen dada. He buscado pero no obtuve la solución exacta. ¿Alguien tiene algunas sugerencias?

Taj Koyal
fuente

Respuestas:

196

Hay un crop()método:

w, h = yourImage.size
yourImage.crop((0, 30, w, h-30)).save(...)
ninjagecko
fuente
1
Sí, sé que im.crop (box) se usa para recortar la imagen. Pero quiero recortar solo la parte superior e inferior de la imagen, no izquierda y derecha, aunque box () toma 4 tuplas, pero no entiendo cómo recortar la parte superior e inferior de la imagen.
Taj Koyal
44
@TajKoyal: Exactamente lo que te está mostrando ninjagecko es cómo recortas la parte superior e inferior. Está especificando un rectángulo para la nueva imagen. Se puede ver que elimina 30 píxeles del valor de y en los puntos superior e inferior. Si compensa los valores de x de alguna manera, eso afectaría los lados izquierdo y derecho.
jdi
1
Gracias a todos por ayudarme.
Taj Koyal
77
Para alguien tan vago como yoParameters: box – The crop rectangle, as a (left, upper, right, lower)-tuple.
Rishav
52

Necesita importar PIL (Pillow) para esto. Supongamos que tiene una imagen de tamaño 1200, 1600. Recortaremos la imagen de 400, 400 a 800, 800

from PIL import Image
img = Image.open("ImageName.jpg")
area = (400, 400, 800, 800)
cropped_img = img.crop(area)
cropped_img.show()
Atul Chavan
fuente
20

(izquierda, superior, derecha, inferior) significa dos puntos,

  1. (izquierda, superior)
  2. (derecha, inferior)

con una imagen de 800x600 píxeles, el punto superior izquierdo de la imagen es (0, 0), el punto inferior derecho es (800, 600).

Entonces, para cortar la imagen a la mitad:

from PIL import Image
img = Image.open("ImageName.jpg")

img_left_area = (0, 0, 400, 600)
img_right_area = (400, 0, 800, 600)

img_left = img.crop(img_left_area)
img_right = img.crop(img_right_area)

img_left.show()
img_right.show()

ingrese la descripción de la imagen aquí

Sistema coordinado

La biblioteca de imágenes de Python utiliza un sistema de coordenadas de píxeles cartesianos, con (0,0) en la esquina superior izquierda. Tenga en cuenta que las coordenadas se refieren a las esquinas de píxeles implícitas; el centro de un píxel dirigido como (0, 0) en realidad se encuentra en (0.5, 0.5).

Las coordenadas generalmente se pasan a la biblioteca como 2-tuplas (x, y). Los rectángulos se representan como 4-tuplas, con la esquina superior izquierda dada primero. Por ejemplo, un rectángulo que cubre toda una imagen de 800x600 píxeles se escribe como (0, 0, 800, 600).

l mingzhi
fuente
13

Una forma más fácil de hacer esto es usar el recorte de ImageOps . Puede alimentar la cantidad de píxeles que desea recortar de cada lado.

from PIL import ImageOps

border = (0, 30, 0, 30) # left, up, right, bottom
ImageOps.crop(img, border)
PouyaB
fuente