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.
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.
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(inputName), 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í).
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.
to [4]: To mě také napadlo a v nějaké minimalistické formě (nejpravděpodobněji přes pypi.python.org) to asi nakonec uvedu v život, ale:
a) V okamžiku, kdy bude uvedena PIL pro Python 3, není důvod v projektu pokračovat. A stále doufám, že to nebude trvat až tak dlouho.
b) Wrapper pro FreeImage pomocí ctypes už existuje (FreeImagePy, viz. odkaz v článku). Není kompatibilní s Pythonem 3, ale, protože už se nejedná právě malý kus kódu, bylo by rozumnější (když už) pokusit se právě o jeho port (2to3 selhává).
Za zájem díky :-) Tak či tak závěr v článku platí, odladěný stávající kód s nějakou funkcionalitou navrch zveřejním.
Student učitelství ICT na PedF UK se zájmem o open source, Python, Scratch, HTML5, výuku programování a mnoha dalších – ne IT – věcí, jako je hudba (Pink Floyd), literatura (G. Orwell) nebo film (S. Kubrick).
Přečteno 16 242×
Přečteno 15 883×
Přečteno 15 320×
Přečteno 13 258×
Přečteno 8 364×