31. Pillow - MantsSk/CA_PTUA14 GitHub Wiki

Darbas su nuotraukomis

Dirbsime su python PIL biblioteka. Diegiasi pip install Pillow. Pradėkime nuo paprasto nuotraukos nuskaitymo ir atvaizdavimo ekrane:

from PIL import Image

im = Image.open("dog.jpg")
im.show()

susikūrėme objektą im, kuris turi daugybę įvairių metodų, jų tarpe ir show(), kuris tiesiog atspausdina nuotrauką ekrane.

Nuotraukos išsaugojimas

Išsaugokime nuotrauką kitu pavadinimu:

from PIL import Image

im = Image.open("dog.jpg")
im.save('large_dog.jpg')

šalia dog.jpg atsirado failas large_dog.jpg. Tai tik paprastas pavyzdys, prieš tai galime atlikti įvairiausias modifikacijas, ir išsaugoti kitame formate, pvz .png

.format, .size, .mode

from PIL import Image

im = Image.open("dog.jpg")
print(im.format, im.size, im.mode)

# JPEG (590, 428) RGB

.thumbnail

from PIL import Image

size = 128, 128
im = Image.open("dog.jpg")
im.thumbnail(size)
im.show()

sukuria miniatiūrą (thumbnail). Metodas išlaiko paveikslėlio proporcijas.

.crop

from PIL import Image

im = Image.open("dog.jpg")
box = (100, 100, 300, 300)
region = im.crop(box)
region.show()

Padaro iškarpą pagal nurodytas koordinates. Koordinačių sistemos pradžia (0,0) yra paveikslėlio viršutiniame-kairiame kampe. Šiuo atveju buvo nurodyti 2 taškai 100,100 ir 300,300.

.transpose

from PIL import Image

im = Image.open("dog.jpg")
im.transpose(Image.FLIP_TOP_BOTTOM).show()

Transformuoja paveikslėlį pagal nurodytą parametrą. Galimi parametrai - Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, Image.ROTATE_90, Image.ROTATE_180,Image.ROTATE_270, Image.TRANSPOSE

.resize()

from PIL import Image

im = Image.open("dog.jpg")
im.resize((500,200)).show()

pakeičia nuotraukos dydį pagal nurodytas reikšmes.

.paste()

ant nuotraukos uždeda kitą nuotrauką. Tarkime turime logotipą su permatomu fonu:

Logotipo .mode turi rodyti reikšmę RGBA, kur A yra alpha channel, kuris nurodo, koks yra pikselio permatomumas. Sakykime, kad mums reikia tos nuotraukos su logo:

from PIL import Image

dog = Image.open('dog.jpg')
logo = Image.open('logo.png')
logo_location = (0, 0, logo.size[0], logo.size[1])
dog.paste(logo, logo_location, logo)
dog.show()

.paste parametrai:

  • logo - mūsų logo
  • logo_location - vieta, kur turės būti įklijuotas logo. Svarbu atsiminti, kad vieta turi būti tokio pat dydžio, kaip ir pats logo, todėl sukurtame tuple logo_location naudojame kintamuosius.
  • trečias parametras yra Image objektas, kurio alpha channel bus naudojamas kaip kaukė (mask). Šiuo atveju tai yra tas pats logo. Jeigu norėtumėm užklijuoti paprastą nuotrauką ant kitos nuotraukos viršaus, paskutinio parametro naudoti nereikia.

Filtrai

from PIL import Image, ImageFilter

dog = Image.open('dog.jpg')
im1 = dog.filter(ImageFilter.BLUR)
im1.show()

Reikės papildomai importuoti ImageFilter modulį. Galimi filtrų variantai: BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN. Apie filtrus daugiau informacijos rasite čia

.getdata()

sukuria objektą, kuriame saugomos visos pikselių reikšmės:

from PIL import Image, ImageFilter

dog = Image.open('dog.jpg')
data = dog.getdata()

for i in range(5):
    print(data[i])

# (89, 142, 72)
# (89, 142, 70)
# (90, 143, 71)
# (90, 148, 74)
# (88, 144, 69)

.putdata()

leidžia pakeisti paveikslėlio pikselius kitomis reikšmėmis:

from PIL import Image, ImageFilter

dog = Image.open('dog.jpg')
new_pixel = (0, 0, 0)
new_data = []
for i in range(10000):
    new_data.append(new_pixel)
dog.putdata(new_data)
dog.show()

viršuje matome 10000 juodų pikselių.

.convert()

from PIL import Image, ImageFilter

dog = Image.open('dog.jpg')
dog_bw = dog.convert("L")
dog_bw.show()

Konverteris tarp "RGB", "RGBA", "L"(juoda-balta), ir daug kitų nuotraukų tipų.

ImageEnchance modulis

papildomai importavus ImageEnchance, galime:

from PIL import Image, ImageEnhance

dog = Image.open('dog.jpg')
enh = ImageEnhance.Contrast(dog)
enh.enhance(1.3).show()

#jeigu norime išsaugoti:
enh.enhance(1.3).save('test.png')

reguliuoti kontrastą, šiuo atveju pridėjome 30%.

  • .Color reguliuoja spalvingumą
  • .Sharpness - aštrumą
  • .Brightness - ryškumą

1

Turime logo su peršviečiamu fonu, dydis 128*128. Atsisiųskite, ir perdarykite taip, kad nuo viršaus ir apačios nusiimtų po 28 eilutes pikselių. Išsisaugokite, nes naudosime sekančioms užduotims.

2

sukurkite funkciją, kuri priimtų

  • paveikslėlį
  • kontrasto, spalvingumo, aštrumo ir ryškumo reikšmes
  • išsaugoti ar ne reikšmę

ir atitinkamai pakoreguotų paveikslėlio nustatymus. Parodytų nuotrauką ekrane. Priklausomai nuo pasirinkimo, išsaugotų arba ne. Išsaugokite faile, prie originalaus pavadinimo pridėję pvz. '_modified', tarkime dog_modified.jpg.

3

Sukurkite programą, kuri, gavusi nuorodą į katalogą, praiteruos visus jame esančius failus, išrinks nuotraukas, pakeis dydį pagal jūsų nurodytą aukštį išlaikant proporcijas, ir kiekvienos nuotraukos apatiniame dešiniajame kampe įdės logotipą, tą kurį išsisaugojote pirmoje užduotyje. Naudokite .resize, kadangi nuotrauką galbūt reikės padidinti, nebūtinai tik sumažinti. Programa pakeistas nuotraukas turi išsaugoti į tame pačiame kataloge sukurtą 'optimized' katalogą.

4

Parašykite programą, kuriai padavus nuotrauką ir R G B reikšmes, ji pakoreguotų kiekvieną pikselį atitinkamai. T.y. jeigu reikšmė teigiama - pridėtų, jeigu neigiama - atimtų. Neleiskite galutinėms reikšmėms būti mažesnėmis už nulį ir didesnėmis už 255!

5

Parašykite programą, kuriai padavus nuotrauką, ir nurodžius pikselio R G B reikšmes, visi pikseliai, kurių nors viena reikšmė viršija jūsų nurodytą ribą, būtų pakeisti baltais, o likusieji juodais.