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

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.

Image for post
Image for post

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:

Image for post
Image for post

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ší.

Image for post
Image for post

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.

Image for post
Image for post

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

Image for post
Image for post
Photo by Luca Bravo on Unsplash

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store