Jak mě proškolil jeden obrázek v PHP

Eduard Štůla
3 min readNov 11, 2020

--

Dnes za mnou přišel kolega, že mu web mění barvu obrázku. Jeho cílem nebylo upozornit na fakt, že PHP není zcela vhodné prostředí pro práci s obrázky. Chtěl jenom pomoc :)

Vlevo je vidět výřez originálu (jpg) a vpravo o kousek tmavší výstup (webp a jpg) po zpracování souboru v PHP. Nedalo mi to, a tak jsem začal pátrat.

Postupně jsem se snažil problém izolovat do krátkého konkrétního kódu. Zahodil jsem tedy ořezy, změny velikostí i PHP wprapper pro práci s obrázky (v mém případě Nette Image). Výsledkem byl podobný kód:

Po přezkoumání všech různých variant od barevného profilu až po dpi původního obrázku jsem si vytvořil testovací obrázek s větší barevnou plochou. Vlevo je vidět původní obrázek a vpravo obrázek, který prošel přes PHP kód beze změn, ve 100% kvalitě.

U toho pravého je vidět určitá komprese s tmavým okrajem. A to přesně dělá ten úplně první kolegovo obrázek tmavší.

Pro mé překvapení jsem se v nejednom threadu na Stack Overflow dozvěděl, že kvalita 100 (třetí parametr v imagejpeg, případně imagewebp) znamená akorát to, že soubor bude velký, ale určitě nemůžu počítat se zachováním 100% kvality vstupního obrázku.

Práci s obrázky v PHP nejčastěji obstarává GD Graphics Library. Poskytuje jí většina hostingů a právě GD doplňuje do PHP např. funkce imagejeg a imagewebp.

Druhou nejčastější knihovnou je ImageMagick. Při testování jsem narazil na to, že třeba Wordpress má podporu jak GD, tak ImageMagick. Podle toho, která knihovna je na webserveru dostupná, tak tu použije. Přednost má ImageMagick před GD.

Zkusil jsem to samé pomocí ImageMagick ve svém izolovaném prostředí a povedlo se. Opět vlevo zdroj a vpravo výstup z PHP.

Zdá se, že ImageMagick bude lepší volba. Jen to bude chtít trochu přeprogramovat CMSko. Než se do toho pustím, musím si udělat důkladnou rešerši “pro” a “proti”, jelikož taková změna zasáhne desítky našich klientů.

Zajímají mě vaše zkušenosti a řešení! Podělte se do komentářů nebo na twitteru ;)

https://twitter.com/EduardStula

Photo by Luca Bravo on Unsplash

--

--