Làm cách nào để cắt ảnh bằng PIL?


133

Tôi muốn cắt hình ảnh theo cách bằng cách xóa 30 hàng đầu tiên và 30 hàng cuối cùng khỏi hình ảnh đã cho. Tôi đã tìm kiếm nhưng không có được giải pháp chính xác. Có ai có một số gợi ý?

Câu trả lời:


195

Có một crop()phương pháp:

w, h = yourImage.size
yourImage.crop((0, 30, w, h-30)).save(...)

1
Có, tôi biết rằng im.crop (hộp) được sử dụng để cắt ảnh. Nhưng tôi muốn cắt chỉ phần trên và phần dưới của hình ảnh không phải trái và phải, mặc dù hộp () mất 4 tuple nhưng tôi không nhận được cách cắt phần trên và phần dưới của hình ảnh.
Taj Kidel

4
@TajKidel: Chính xác những gì ninjagecko đang cho bạn thấy là cách bạn cắt bỏ phần trên và phần dưới. Ông đang chỉ định một hình chữ nhật cho hình ảnh mới. Bạn có thể thấy rằng anh ta tắt 30 pixel từ giá trị y ở các điểm trên cùng và dưới cùng. Nếu bạn bù các giá trị x theo bất kỳ cách nào, THAT sẽ ảnh hưởng đến bên trái và bên phải.
jdi

1
Cảm ơn mọi người đã giúp tôi ra ngoài.
Taj Kidel

7
Dành cho người lười biếng như tôiParameters: box – The crop rectangle, as a (left, upper, right, lower)-tuple.
Rishav

52

Bạn cần nhập PIL (Gối) cho việc này. Giả sử bạn có một hình ảnh có kích thước 1200, 1600. Chúng tôi sẽ cắt hình ảnh từ 400, 400 đến 800, 800

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

20

(trái, trên, phải, dưới) có nghĩa là hai điểm,

  1. (trái, trên)
  2. (phải, thấp hơn)

với hình ảnh 800x600 pixel, điểm trên bên trái của hình ảnh là (0, 0), điểm dưới bên phải là (800, 600).

Vì vậy, để cắt một nửa hình ảnh:

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

nhập mô tả hình ảnh ở đây

Hệ tọa độ

Thư viện hình ảnh Python sử dụng hệ thống tọa độ pixel của Cartesian, với (0,0) ở góc trên bên trái. Lưu ý rằng tọa độ đề cập đến các góc pixel ngụ ý; tâm của một pixel có địa chỉ là (0, 0) thực sự nằm ở (0,5, 0,5).

Các tọa độ thường được chuyển đến thư viện dưới dạng 2-tuples (x, y). Hình chữ nhật được biểu diễn dưới dạng 4 tuple, với góc trên bên trái được đưa ra đầu tiên. Ví dụ: một hình chữ nhật bao gồm tất cả hình ảnh 800x600 pixel được viết là (0, 0, 800, 600).


13

Một cách dễ dàng hơn để làm điều này là sử dụng crop từ ImageOps . Bạn có thể cung cấp số lượng pixel bạn muốn cắt từ mỗi bên.

from PIL import ImageOps

border = (0, 30, 0, 30) # left, up, right, bottom
ImageOps.crop(img, border)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.