2009-07-02 19 views
38

Im tratando de recortar una imagen de muy alta resolución y guardar el resultado para asegurarme de que se completó. Sin embargo me siguen dando el siguiente error, independientemente de cómo utilizo el método Save: SystemError: tile cannot extend outside imageProblema al utilizar la biblioteca de PIL de Python para recortar y guardar la imagen

from PIL import Image 

# size is width/height 
img = Image.open('0_388_image1.jpeg') 
box = (2407, 804, 71, 796) 
area = img.crop(box) 

area.save('cropped_0_388_image1', 'jpeg') 
output.close() 
+1

También tenga en cuenta que si el área tiene ancho o alto igual a 0 como '(0, 0, 0, 10)' o '(0, 0, 10, 0)', se generará el mismo error. – Natim

+0

¿Qué es 'salida'? – iacopo

+0

@Natim Has solucionado mi problema. – teewuane

Respuesta

57

La caja está (izquierda, superior, derecha, inferior) de modo tal que significaba (2407, 804, 2407 + 71, 804 +796)?

Editar: Las cuatro coordenadas se miden desde la esquina superior/izquierda, y describen la distancia desde esa esquina al borde izquierdo, borde superior, borde derecho y borde inferior.

El código debería tener este aspecto, para obtener un área de 300x200 posición 2407.804:

left = 2407 
top = 804 
width = 300 
height = 200 
box = (left, top, left+width, top+height) 
area = img.crop(box) 
+0

:) Sí, de hecho, la imagen es tan grande. Es casi 1Mg .. es una imagen de una intersección lo que entendí es esto: la documentación dice izquierda arriba (arriba) derecha abajo (abajo) que es EXACTAMENTE lo que puse. Los coords de píxeles son 2407 de los 804 píxeles IZQUIERDOS desde el TOP 71 píxeles desde el DERECHO y 796 píxeles desde el FONDO. No veo dónde me equivoqué. el recuadro así descrito recorta el extremo de un vehículo –

+1

Todas las coordenadas se miden desde la esquina superior/izquierda, y describen la distancia desde esa esquina hasta el borde izquierdo, borde superior, borde derecho y borde inferior. – RichieHindle

+0

Debo ser retrasado. Intenté lo que pensé que querías decir y ahora es una pequeña astilla: caja = (1465, 1788, 3801, 1796) –

13

Prueba esto:

se trata de un simple código para recortar una imagen, y funciona como una encanto;)

import Image 

def crop_image(input_image, output_image, start_x, start_y, width, height): 
    """Pass input name image, output name image, x coordinate to start croping, y coordinate to start croping, width to crop, height to crop """ 
    input_img = Image.open(input_image) 
    box = (start_x, start_y, start_x + width, start_y + height) 
    output_img = input_img.crop(box) 
    output_img.save(output_image +".png") 

def main(): 
    crop_image("Input.png","output", 0, 0, 1280, 399) 

if __name__ == '__main__': main() 

en este caso, la imagen de entrada es de 1280 x 800 px y la croped es 1280 x 399px comenzando en la esquina superior izquierda.

Cuestiones relacionadas