Bagaimana cara memotong gambar menggunakan PIL?

134

Saya ingin memotong gambar dengan menghapus 30 baris pertama dan 30 baris terakhir dari gambar yang diberikan. Saya telah mencari tetapi tidak mendapatkan solusi yang tepat. Apakah ada yang punya saran?

Taj Koyal
sumber

Jawaban:

196

Ada crop()metode:

w, h = yourImage.size
yourImage.crop((0, 30, w, h-30)).save(...)
ninjagecko
sumber
1
Ya, saya tahu bahwa im.crop (kotak) digunakan untuk memotong gambar. Tapi saya ingin memotong hanya bagian atas dan bawah gambar tidak kiri dan kanan, meskipun kotak () mengambil 4 tupel tetapi saya tidak mendapatkan cara memotong bagian atas dan bawah gambar.
Taj Koyal
4
@TajKoyal: Persis apa yang ninjagecko tunjukkan kepada Anda adalah bagaimana Anda memotong bagian atas dan bawah. Dia menentukan persegi panjang untuk gambar baru. Anda dapat melihat bahwa ia memotong 30 piksel dari nilai-y pada titik atas dan bawah. Jika Anda mengimbangi nilai x dengan cara apa pun, ITULAH akan mempengaruhi sisi kiri dan kanan.
jdi
1
Terima kasih kawan untuk membantu saya.
Taj Koyal
7
Untuk seseorang yang malas seperti sayaParameters: box – The crop rectangle, as a (left, upper, right, lower)-tuple.
Rishav
52

Anda perlu mengimpor PIL (Bantal) untuk ini. Misalkan Anda memiliki gambar dengan ukuran 1200, 1600. Kami akan memotong gambar dari 400, 400 hingga 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
sumber
20

(kiri, atas, kanan, bawah) berarti dua poin,

  1. (kiri, atas)
  2. (kanan, bawah)

dengan gambar 800x600 piksel, titik atas kiri gambar adalah (0, 0), titik bawah kanan adalah (800, 600).

Jadi, untuk memotong setengah gambar:

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

masukkan deskripsi gambar di sini

Sistem koordinasi

Python Imaging Library menggunakan sistem koordinat piksel Cartesian, dengan (0,0) di sudut kiri atas. Perhatikan bahwa koordinat mengacu pada sudut piksel tersirat; pusat piksel yang dialamatkan sebagai (0, 0) sebenarnya terletak pada (0,5, 0,5).

Koordinat biasanya diteruskan ke perpustakaan sebagai 2-tupel (x, y). Rectangles direpresentasikan sebagai 4-tupel, dengan sudut kiri atas diberikan terlebih dahulu. Misalnya, persegi panjang yang mencakup semua gambar 800x600 piksel ditulis sebagai (0, 0, 800, 600).

l mingzhi
sumber
13

Cara yang lebih mudah untuk melakukan ini adalah menggunakan pemotongan dari ImageOps . Anda dapat memberi makan jumlah piksel yang ingin Anda potong dari setiap sisi.

from PIL import ImageOps

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