Python 3 a konverze obrázků

24. 7. 2011 15:55 (aktualizováno) Lukáš Kotek

Ve světě Pythonu je nepsaným standardem pro zpracování obrázků knihovna PIL (Python Imaging Library). Bohužel, ačkoliv je s námi Python 3 už takřka 3 roky (první verze řady 3 vyšla v roce 2008), PIL existuje stále jen pro verze řady 2. Na webu projektu už delší dobu nalezneme pouze informaci o tom, že pro řadu 3 bude uveřejněna později.

Při hledání náhradních řešení rychle dospějeme k tomu, že jich je málo nebo nejsou dostupná vůbec žádná. Pro Python 2 je k PIL dostupných několik alternativ, např. FreeImagePy (wrapper pro knihovnu FreeImage) nebo PythonMagic (totéž pro ImageMagic). Problém sice žádná neřeší, ale může nasměrovat správným směrem.

Požadavky

Moje požadavky byly minimalistické – zjistit základní parametry obrázku (rozměry) a následně změnit jeho velikost (předpokládaným použitím je konverze obrázků po nahrání na webový server). Rozhodl jsem se použít právě knihovnu FreeImage, která je multiplatformní (výsledek musí být funkční pod GNU/Linuxem i Windows) a Open source (pro nekomerční i komerční použití). K její funkcionalitě pak přistupuji přes ctypes.

Instalace knihovny FreeImage (verze 3.15) pod GNU/Linuxem je jednoduchá, pravděpodobně bude obsažena v repozitáři dané distribuce (v Debianu 6 určitě). Pod Windows je třeba ji stáhnout z webu projektu a samotný soubor knihovny (FreeImage.dll) překopírovat do složky C:\Windows\system. Tolik k samotné instalaci.

Realizace v Pythonu

Nejprve provedeme potřebný import modulů:

from ctypes import *

V prostředí GNU/Linuxu přistupujeme ke knihovně z Pythonu následujícím způsobem:

cdll.LoadLibrary(„libfreeimage.so.3“)

Ve Windows bychom to provedli takto:

windll.FreeImage

Dále už můžeme přistupovat ke všem funkcím obsaženým v knihovně. Implementace změny velikosti pak pro použití na GNU/Linuxu (knihovna obsahuje i verze funkcí, které lze použít pouze na Windows) může vypadat například takto:

from ctypes import * fi = cdll.LoadLibrary(„libfreeimage.so.3“) fi.FreeImage_Initialise(0) imageType = fi.FreeImage_GetFileType(c_char_p(in­putName), 0) bitmap = fi.FreeImage_Load(imageType, c_char_p(inputName), 0) bitmap = fi.FreeImage_Rescale(bitmap, 300, 300, 5) fi.FreeImage_Save(imageType, bitmap, c_char_p(outputName), 0) fi.FreeImage_Unload(bitmap) fi.FreeImage_DeInitialise()

Veřím, že názvy funkcí jsou dostatečně popisné, snad jen s výjimkou FreeImage_Rescale, kde druhý a třetí parametr udává šířku a výšku výsledného obrázku, čtvrtý pak určuje metodu převzorkování a má tak výrazný dopad na kvalitu (5 odpovídá metodě Lanczos).

Pokud byste chtěli použít další funkce z knihovny FreeImage, mohu odkázat na oficiální dokumentaci (a že to je výživné čtení).

Závěr

Pokud byste měli zájem celý výsledný program nějakým způsobem použít (je realizovaný jako primitivní modul), pak celé řešení dávám zde ke stažení: pypicon. Je licencován shodně jako původní FreeImage knihovna (zmíněno výše). Modul jsem testoval pod Debianem 6 a Windows 7 s 32bitovou verzí Pythonu 3.1.

Program jsem napsal jako řešení své aktuální potřeby. Jedná se o poměrně ranný kus kódu a je tomu poplatný. Řada věcí ještě není ošetřena. Pokud někomu pomůže, budu jen rád, ale prosím přistupujte k němu podle toho. V budoucnu pravděpodobně ještě budu přidávat nějakou funkcionalitu, pokud by o ni byl nějaký zájem zmiňte to prosím v diskuzi.

Sdílet