2009-07-02 42 views
38

Tôi đang cố gắng cắt hình ảnh có độ phân giải khá cao và lưu kết quả để đảm bảo hoàn thành. Tuy nhiên tôi tiếp tục nhận được lỗi sau bất kể thế nào tôi sử dụng phương pháp tiết kiệm: SystemError: tile cannot extend outside imageGặp sự cố khi sử dụng thư viện PIL trăn để cắt và lưu hình ảnh

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

Cũng lưu ý rằng nếu khu vực có chiều rộng hoặc chiều cao bằng 0 như '(0, 0, 0, 10)' hoặc '(0, 0, 10, 0)' nó sẽ tăng cùng một lỗi. – Natim

+0

'đầu ra' là gì? – iacopo

+0

@Natim Bạn đã giải quyết được vấn đề của mình. – teewuane

Trả lời

57

Hộp được (bên trái, phía trên, bên phải, thấp hơn) như vậy có lẽ bạn có nghĩa là (2407, 804, 2407 + 71, 804 +796)?

Chỉnh sửa: Tất cả bốn toạ độ được đo từ góc trên cùng bên trái và mô tả khoảng cách từ góc đó sang cạnh trái, cạnh trên, cạnh phải và cạnh dưới.

Mã của bạn sẽ trông như thế này, để có được một khu vực 300x200 từ vị trí 2407.804:

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

:) Có thực sự hình ảnh đó là lớn. Nó gần như 1Mg .. một hình ảnh của một giao lộ những gì tôi hiểu là: tài liệu nói trên bên trái (trên) bên phải dưới (dưới) là CHÍNH XÁC những gì tôi đưa vào. Các coords pixel là 2407 từ LEFT 804 pixel từ TOP 71 pixel từ RIGHT và 796 pixel từ BOTTOM. Tôi không thấy nơi tôi đã sai lầm. hộp như vậy mô tả cây trồng của một kết thúc trở lại của xe –

+1

Tất cả các tọa độ được đo từ góc trên cùng bên trái, và mô tả khoảng cách từ góc đó đến cạnh trái, cạnh trên, cạnh phải và cạnh dưới. – RichieHindle

+0

Tôi phải chậm phát triển. Tôi đã thử những gì tôi nghĩ bạn có nghĩa là và bây giờ của nó một mảnh nhỏ nhỏ: hộp = (1465, 1788, 3801, 1796) –

13

Hãy thử điều này:

đó là một mã đơn giản để cắt một hình ảnh, và nó hoạt động như một charm;)

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

Trong trường hợp này, hình ảnh đầu vào là 1280 x 800 pixel và cắt 1280 x 399px bắt đầu từ góc trên cùng bên trái.

Các vấn đề liên quan