วิธีการครอบตัดรูปภาพโดยใช้ PIL


142

ฉันต้องการครอบตัดรูปภาพโดยลบ 30 แถวแรกและ 30 แถวสุดท้ายออกจากรูปภาพที่กำหนด ฉันได้ค้นหา แต่ไม่ได้รับคำตอบที่แน่นอน ใครมีคำแนะนำบ้าง?

คำตอบ:


203

มีcrop()วิธีการ:

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

1
ใช่ฉันรู้ว่า im.crop (กล่อง) ใช้สำหรับการครอบตัดรูปภาพ แต่ฉันต้องการครอบตัดเฉพาะส่วนบนและส่วนล่างของรูปภาพไม่ใช่ซ้ายและขวาแม้ว่า box () จะใช้ 4 ทูเปิล แต่ฉันไม่เข้าใจวิธีการครอบตัดส่วนบนและส่วนล่างของรูปภาพ
Taj Koyal

4
@TajKoyal: สิ่งที่ Ninjagecko แสดงให้คุณเห็นคือวิธีที่คุณครอบตัดด้านบนและด้านล่าง เขากำลังระบุสี่เหลี่ยมผืนผ้าสำหรับรูปภาพใหม่ คุณจะเห็นว่าเขาลบ 30 พิกเซลจากค่า y ที่จุดบนและจุดล่างสุด หากคุณหักล้างค่า x ไม่ว่าด้วยวิธีใดสิ่งนั้นจะส่งผลต่อด้านซ้ายและด้านขวา
jdi

1
ขอบคุณทุกคนที่ช่วยฉัน
Taj Koyal

8
สำหรับคนขี้เกียจอย่างฉันParameters: box – The crop rectangle, as a (left, upper, right, lower)-tuple.
Rishav

54

คุณต้องนำเข้า PIL (หมอน) สำหรับสิ่งนี้ สมมติว่าคุณมีรูปภาพขนาด 1200, 1600 เราจะครอบตัดรูปภาพจาก 400, 400 ถึง 800, 800

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

25

(ซ้ายบนขวาล่าง) หมายถึงสองจุด

  1. (ซ้ายบน)
  2. (ขวาล่าง)

ด้วยภาพ 800x600 พิกเซลจุดบนซ้ายของภาพคือ (0, 0) จุดล่างขวาคือ (800, 600)

ดังนั้นสำหรับการตัดครึ่งภาพ:

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

ป้อนคำอธิบายภาพที่นี่

ระบบพิกัด

Python Imaging Library ใช้ระบบพิกัดพิกเซลคาร์ทีเซียนโดยมี (0,0) อยู่ที่มุมซ้ายบน โปรดทราบว่าพิกัดหมายถึงมุมพิกเซลโดยนัย จุดศูนย์กลางของพิกเซลที่ระบุว่า (0, 0) อยู่ที่ (0.5, 0.5)

โดยปกติพิกัดจะถูกส่งไปยังไลบรารีเป็น 2-tuples (x, y) รูปสี่เหลี่ยมจะแสดงเป็น 4 tuples โดยให้มุมซ้ายบนก่อน ตัวอย่างเช่นสี่เหลี่ยมผืนผ้าที่ครอบคลุมรูปภาพ 800x600 พิกเซลทั้งหมดจะเขียนเป็น (0, 0, 800, 600)


13

เป็นวิธีที่ง่ายต่อการทำเช่นนี้คือการใช้พืชจากImageOps คุณสามารถป้อนจำนวนพิกเซลที่ต้องการครอบตัดจากแต่ละด้าน

from PIL import ImageOps

border = (0, 30, 0, 30) # left, up, right, bottom
ImageOps.crop(img, border)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.