A Python Imaging Library egy képfeldolgozási célokra írt könyvtár. Kizárólag raszteres képek kezelésére alkalmas, ezek közül a ma használatos formátumok szinte mindegyikét támogatja – az ilyen képek az egyes képpontok jellemzőit tárolják, mint például szín vagy intenzitás, szemben a geometrikus képekkel, melyek a képen található képelemek leírásának, egyenletének valamilyen felsorolását tartalmazzák –. Hatékony belső reprezántációval rendelkezik, és képfeldolgozási eljárások széleskörű választékát nyújtja. Legalábbis a referencia szerint.
A jelenlegi – 2.4.2 – python szabvány szabványos könyvtárának nem része, viszont a PIL magában foglalja a szabványos könyvtár Tkinter moduljának bizonyos részeit – például a Tk PhotoImage és BitmapImage interfészeket.
A képek méretének megadására és lekérdezésére egységesen egy kételemű tuple-t használ, melynek elemei a kép vízszintes és függőleges mérete pixelekben. A méret paramétert a továbbiakban „size” jelöli. Ahol a kép egy részét az azt befoglaló téglalappal jelölhetjük ki, ott 4-es tuple-t kell használnunk.
A PIL a szokványos derékszögű koordinátarendszert használja, az origóval a bal felső sarokban. Itt érdemes még megjegyezni, hogy a koordináták a pixelek sarkaira vonatkoznak, így a (0,0)-val címzett pixel középpontja ténylegesen (0.5,0.5). A mérethez hasonlóan a koordináták is általában kételemű tuple-ek formájában adódnak át.
Néhány művelethez módot is megadhatunk, ezt minden esetben egy „mode” nevű paraméter fogja jelezni a továbbiakban. Ez definiálja a kép pixeleinek típusát és színmélységét. A jelenlegi verzió a következőeket támogatja:
A PIL többrétegű képeket is támogat, az egyes rétegek méretének és mélységének meg kell egyezniük.
Az Image Modul voltaképpen mindennek az alapja, a szokásos konstansokon és néhány segédfüggvényen kívül az Image osztályt tartalmazza, mely a PIL képek reprezentálására szolgál. Az egyes műveletek eredménye legtöbbször egy képobjektum, megkönnyítve ezzel több művelet egymás után való alkalmazását. Az ettől való eltérést külön jelezni fogjuk.
Pl:
Egy könyvtárban található összes JPEG-ről thumbnail készítése is csak néhány sor:
A leggyakrabban használt metódusok képek létrehozására, megnyitására szolgálnak, valamint már az Image osztály maga is rendelkezik néhány képfeldolgozó művelettel:
Ezeken kívül még számos eljárással rendelkezik, mint például pixelek lekérdezése, beállítása, képek téglalap alakú részképeinek lekérdezése és beállítása, pozícionálás, különböző sávműveletek, valamint más, a képeken szokványos transzformációs műveletek.
Ez a modul aritmetikus képműveleteket tartalmaz – elnevezésük channel operations („chops”) –. Ezek a kép, vagy képek egyes pixelein végeznek el egy megadott aritmetikai műveletet. Az implementáció minden esetben gondoskodik arról, hogy az eredmények ne lépjenek ki a színtartományból, azaz 0..MAX-ból, ahol MAX a jelenleg támogatott formátumokra 255 – ez abból adódik, hogy a legfrissebb verzióban a modul műveletei csak 8-bites képekre vannak implementálva. A műveletek egy Image objektumot adnak vissza, amely megkönnyíti azok egymás után való alkalmazását. Az itteni függvények egy része az Image osztályban is megtalálható.
Néhány példa az itteni lehetőségeinkre:
Színtáblákat és konverziós műveleteket tartalmaz CSS3 stílusú színleírókról RGB tuple-ekre. Többek között ezt a modult használja az Image osztály new művelete és az ImageDraw modul.
Az alábbi stringformátumokat támogatja:
A konverziót a getrgb(color) függvény végzi, amely a paraméterként kapott, fent felsorolt típusú stringből egy RGB tuple-t állít elő. Hasonlóképp működik a getcolor(color, mode) függvény, amely azonban „L” vagy „P” mód esetén RGB helyett egy szürkeárnyalat értéket ad vissza. Mindkét művelet hibás string esetén ValueError kivételt dob.
Ez a modul tartalmazza a szokványos rajzoló eljárásokat, mint például vonal-, körcikk-, sokszögrajzolás, szöveg írása, kitöltés stb. Ezeket a műveleteket új képek létrehozására, és már meglévő képeken is használhatjuk. Mindkét esetben egy Draw objektumot kell létrehoznunk, a megfelelő Image objektummal inicializálva. A különböző rajzoló műveleteket a Draw típusú objektumon alkalmazva ezután a változások a hivatkozott képen történnek, helyben végrehajtva. A Draw objektum rendelkezik a szokásos beállításokkal, úgy mint aktuális kitöltőszín, festőszín, betűtípus.
Mostmár minden adott ahhoz, hogy írjunk egy gyors Hello World-öt.
Itt javíthatunk még egy keveset képünk minőségén. A modul erre a célra négy osztályt tartalmaz, melyek objektumai egy-egy képre hivatkoznak. Mindegyik egy metódust tartalmaz, amely bemenetként egy lebegőpontos faktort kap, melynek értékére nincs megkötés, kimenetként az így előállított képet adja. Ha a faktor 1.0, a visszaadott érték mindig az eredeti képpel megegyező képet leíró objektum.
Képfájlok megnyitásához és mentéséhez nyújt támogatást. Tartalmazza többek között a Parser osztályt, mely főként képek részenkénti dekódolására használható – például ha a képet hálózaton keresztül kapjuk –. Két metódusa van, a feed és a close. Előbbi az elemenkénti feldolgozást végzi, esetlegesen IOError kivételt dobva. Utóbbi befejezi a dekódolást, és amennyiben a dekódolás sikeres volt, visszaadja az előállított képet – ellenkező esetben ez is IOError kivételt dob.
Pl:
Az előzővel azonos célokat szolgál, ez a régebbi verzió, így fájlműveletekre inkább az előző modul Parser osztálya ajánlott.
Itt találhatók a predefinit szűrők. A szokásos szűrők nagy része implementálva van, néhányat azonban esetleg hiányolhatunk – ilyen például a Gauss-szűrő –, mint ahogy a meglévők paraméterezésére – a méretet leszámítva – sincs túl sok lehetőségünk. Némi vigaszt nyújthatna, hogy a Kernel osztály használatával elméletileg tetszőleges téglalap alakú szűrőmátrixot megadhatunk, viszont a könyvtár jelenlegi verziója még csak a 3x3-as és 5x5-ös mátrixokat támogatja.
A szűrőket egy adott képre az Image osztály filter metódusával tudjuk alkalmazni, amely az így eredményül kapott képpel tér vissza. A különböző gyorsítási lehetőségekről – pl. általunk megadott szűrők esetén a szeparábilisség kezelése, szűrők konvolúciója stb. – a referencia nem tesz említést, így valószínűleg ezeket sem támogatja.
A modul által jelenleg nyújtott szűrők:
BLUR, CONTOUR, DETAIL,
EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE,
SHARPEN;
RankFilter(size, rank), MinFilter(size=3),
MedianFilter(size=3), MaxFilter(size=3).
Valamint a már említett Kernel(size, kernel, scale=None, offset=0) konstruktor segítségével hozhatunk létre jelenleg még csak 3x3-as, vagy 5x5-ös szűrőket, melyeket egyelőre csak „L” és „RGB” képeken alkalmazhatunk. A size paraméter értéke így (3,3) vagy (5,5), a kernel a mátrix lebegőpontos súlyainak sorfolytonos felsorolása, a scale azt az értéket adja meg, amivel az egyes pixelek értékei leosztásra kerülnek – alapértelmezésben az eredmény minden pixelje a kernel súlyainak összegével kerül lenormálásra –, míg az offset paraméter segítségével tolhatjuk el a számított pixel értékeket, tehát ez adódik az eredmény kép minden pixeléhez.
A modul nevével megegyező osztályt tartalmazza. Ez végzi a különböző betűtípusváltásokat, objektumait az ImageDraw osztály használja. A betűtípusok leírására saját fájlformátumot használ, cserébe viszont a PIL ad egy utilityt – pilfont –, amely a szokványos fontleírókat átkonvertálja.
Pl:
A betöltő metódusokon kívül tartalmaz még két hasznos műveletet is:
Az azonos nevű osztályt tartalmazza. Ennek grab metódusa egy sima print screen eredményét, tehát a képernyő tartalmát, vagy a vágólapot adja vissza Image objektummá konvertálva. Adhatunk neki egy doboz argumentumot is, ekkor csak a képernyő dobozon belüli részét kapjuk. Egyelőre csak Windows alá van implementálva.
Ez a modul félig-meddig még kísérleti jellegű, a műveletek nagy része csak „L” és „RGB” képekre működik. További hasznos képfeldolgozó eljárásokat tartalmaz. Ilyenek például az invertálás, invertálás egy megadott küszöbre, autocontrast – a hisztogram alapján a paraméterként kapott százaléknyi legsötétebb és legvilágosabb intenzitást levágja, majd a maradék hisztogramot a teljes színtartományra normalizálja –, egy szürkeárnyalatos kép kiszínezése, kép határának eltávolítása és kitöltése, hisztogram-kiegyenlítés, tükrözés stb.
Számunkra nem túl érdekes, Path objektumokat gyárt, melyeket az ImageDraw osztály metódusai használnak.
Az azonos nevű osztályt tartalmazza, melyet az Image osztály használ.
Pl:
A konstruktorban azt a módot kell megadni, amelyre a palettával le szeretnénk képezni.
Egy wrapper osztályt tartalmaz, amely lehetőséget ad egy képsorozat elemein való iterálásra. Az Iterator osztály konstruktora ennek megfelelően a paraméterként kapott képre mutató iterátort ad vissza, metódusként pedig a [] operátort tartalmazza, amely a 0-tól kezdődő indexelést teszi lehetővé.
Ezzel a modullal különféle statisztikákat számolhatunk a képünkről, vagy annak egy részéről. Ehhez először létre kell hoznunk egy Stat objektumot az adott Image objektumra. Ez kaphat még egy maszk vagy egy lista – így tárolja a PIL a hisztogramokat, ld. fentebb – paramétert, amellyel a kép vizsgálni kívánt darabját jelölhetjük ki. Többrétegű képek esetén az eredmény a rétegekre számított értékek sorozata lesz. Fontos megjegyezni, hogy minden statisztika a stat objektum attribútuma lesz, és csak használatkor értékelődik ki.
A Tkinter modullal való kompatibilitás érdekében különböző konstruktorokat tartalmaz BitmapImage és PhotoImage objektumok létrehozására.
A Windows-kompatibilitást hivatott szolgálni. Ehhez Dib objektumokat – Windows bitmap – enged létrehozni, kirajzolni, valamint meglévő PIL képeinket konvertálhatjuk át.
Postscript nyomtatáshoz ad néhány egyszerű támogatást.
Csak a PIL Plus tartalmazza. Ez a modul főbb képjellemzők detektálására ad lehetőséget. Hogy csak a legjelentősebbeket említsük: élek, sarkok, centroid stb.
Ahogy már megszoktuk, itt is először egy CrackCode objektumot kell létrehoznunk az adott PIL képre, paraméterként megadhatjuk még, hogy a kép mely pozíciójától kezdje a vizsgálatot. Alapértelmezésben ez a bal felső sarok.
BMP |
".bmp", ".dib" |
CUR |
".cur" |
DCX |
".dcx" |
EPS |
".eps", ".ps" |
FLI |
".fli", ".flc" |
FPX |
".fpx" |
GBR |
".gbr" |
GD |
".gd" |
GIF |
".gif" |
ICO |
".ico" |
IM |
".im" |
JPEG |
".jpg", ".jpe", ".jpeg" |
MIC |
".mic" |
MSP |
".msp" |
PCD |
".pcd" |
PCX |
".pcx" |
PDF |
".pdf" |
PNG |
".png" |
PPM |
".pbm", ".pgm", ".ppm" |
PSD |
".psd" |
SGI |
".bw", ".rgb", ".cmyk" |
SUN |
".ras" |
TGA |
".tga" |
TIFF |
".tif", ".tiff" |
XBM |
".xbm" |
XPM |
".xpm" |