Jak przyciąć obraz za pomocą PIL?

142

Chcę przyciąć obraz w taki sposób, usuwając pierwsze 30 wierszy i ostatnie 30 wierszy z danego obrazu. Szukałem, ale nie znalazłem dokładnego rozwiązania. Czy ktoś ma jakieś sugestie?

Taj Koyal
źródło

Odpowiedzi:

203

Jest crop()metoda:

w, h = yourImage.size
yourImage.crop((0, 30, w, h-30)).save(...)
ninjagecko
źródło
1
Tak, wiem, że im.crop (box) służy do przycinania obrazu. Ale chcę przyciąć tylko górną i dolną część obrazu, a nie lewą i prawą, chociaż box () zajmuje 4 krotki, ale nie rozumiem, jak przyciąć górną i dolną część obrazu.
Taj Koyal
4
@TajKoyal: Dokładnie to, co pokazuje ci Ninjagecko, to sposób, w jaki odcinasz górę i dół. Określa prostokąt dla nowego obrazu. Możesz zobaczyć, że goli 30 pikseli od wartości y na górnym i dolnym punkcie. Jeśli przesuniesz wartości x w jakikolwiek sposób, TO wpłynie na lewą i prawą stronę.
jdi
1
Dzięki za pomoc.
Taj Koyal
8
Dla kogoś tak leniwego jak jaParameters: box – The crop rectangle, as a (left, upper, right, lower)-tuple.
Rishav
54

W tym celu musisz zaimportować PIL (Pillow). Załóżmy, że masz obraz o rozmiarze 1200, 1600. Przycinamy obraz z 400, 400 do 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
źródło
25

(lewy, górny, prawy, dolny) oznacza dwa punkty,

  1. (lewa, górna)
  2. (prawy, dolny)

w przypadku obrazu o rozdzielczości 800x600 pikseli lewy górny punkt obrazu to (0, 0), a prawy dolny punkt to (800, 600).

Tak więc, aby przeciąć obraz na pół:

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

wprowadź opis obrazu tutaj

System współrzędnych

Biblioteka Python Imaging Library korzysta z kartezjańskiego układu współrzędnych pikseli, z (0,0) w lewym górnym rogu. Zwróć uwagę, że współrzędne odnoszą się do domniemanych rogów pikseli; środek piksela adresowany jako (0, 0) w rzeczywistości leży na (0,5, 0,5).

Współrzędne są zwykle przekazywane do biblioteki w postaci 2 krotek (x, y). Prostokąty są reprezentowane jako 4 krotki, z lewym górnym rogiem podanym jako pierwszy. Na przykład prostokąt obejmujący cały obraz o wymiarach 800x600 pikseli jest zapisywany jako (0, 0, 800, 600).

l mingzhi
źródło
13

Łatwiejszym sposobem jest użycie funkcji crop from ImageOps . Możesz podać liczbę pikseli, które chcesz przyciąć z każdej strony.

from PIL import ImageOps

border = (0, 30, 0, 30) # left, up, right, bottom
ImageOps.crop(img, border)
PouyaB
źródło