Efekt zrcadlení obrázku v PHP
15. 11. 2008 000 19.06 Programování
Už jsem zde dlouho nenapsal nějaký script, tak to dnes napravím. Nedávno jsem v PHP potřeboval k obrázku přidat zrcadlový efekt, jak jde vidět na ukázkových obrázcích níže. Tento efekt může najít uplatnění v různých galeriích, portfoliích a podobných projektech. Možná se to někomu bude hodit a využije to…
Praktická ukázka – vlevo vstupní obrázek, napravo výstupní obrázek
Na vyřešení problému jsem napsal následující funkci, která má jeden povinný parametr, kterým je cesta ke vstupnímu obrázku. Dále jsou k dispozici dva nepovinné parametry – velikost zrcadlení v procentech (defaultní hodnota je 25) a RGB barva pozadí (defaultní je černá).
Samotná funkce je jednoduchá, využívá funkce grafické knihovny GD2 a skládá se ze 3 částí. V první z nich se načte vstupní obrázek, zjistí se rozměry a vypočítají se rozměry výstupního obrázku. Ve druhé části se provádí zrcadlení požadované oblasti a v poslední třetí částí se doplní barevný přechod.
/** Vygenerování zrcadlového odrazu ke vstupnímu obrázku
* @param string $soubor řetězec obsahující cestu ke vstupnímu jpg obrázku
* @param int $velikost velikost zrcadlení v procentech od 1 do 100, defaultně 25
* @param mixed $barva barva pozadí v RGB, zadává se jako pole, defaultně array(0,0,0)
* @return mixed výsledný obrázek jako identifikátor
* @copyright Petr Kašpar, http://blog.petrkaspar.cz/
*/
function zrcadliObrazek($soubor, $velikost=NULL, $barva=NULL) {
//Doplnění defaultních parametrů
if($velikost == NULL) $velikost = 25;
if($barva == NULL) $barva = array(0,0,0);
//Načtení obrázku, zjištění rozměrů
$obrazekVstup = imagecreatefromjpeg($soubor);
$obrazekSirka = imagesx($obrazekVstup);
$obrazekVyska = imagesy($obrazekVstup);
$velikostZrcadleni = $obrazekVyska / (100 / $velikost);
$obrazekVyskaNova = $obrazekVyska + $velikostZrcadleni;
$obrazekVystup = imagecreatetruecolor($obrazekSirka, $obrazekVyskaNova);
//Zrcadlení části obrázku podle zadané velikosti
$x = 1;
for($y = $obrazekVyska - $velikostZrcadleni; $y < $obrazekVyska; $y++){
imagecopy($obrazekVystup, $obrazekVstup, 0, ($obrazekVyskaNova - $x),
0, $y, $obrazekSirka, 1);
$x++;
}
//Přidání grandientu
$alfa = 100;
$alfaKrok = $alfa / ($obrazekVyskaNova - $obrazekVyska);
for($y = $obrazekVyska; $y < $obrazekVyskaNova; $y++){
for($x = 0; $x < $obrazekSirka; $x++){
$novaBarva = imagecolorallocatealpha ($obrazekVystup,
$barva[0], $barva[1], $barva[2], $alfa);
imagesetpixel ($obrazekVystup, $x, $y, $novaBarva);
}
$alfa -= $alfaKrok;
}
//Vložení původního obrázku
imagecopy($obrazekVystup, $obrazekVstup, 0, 0, 0, 0, $obrazekSirka, $obrazekVyska);
imagedestroy($obrazekVstup);
return $obrazekVystup;
}
Zde je k vidění příklad použití mé funkce. Kromě cesty ke vstupnímu obrázku jsem ještě nadefinoval barvu pozadí na světle šedou, velikost zrcadlení jsem nevyplňoval a nechal defaultní. Výsledný obrázek se následně zobrazí v prohlížeči ve formátu PNG. Toto nastavení vygeneruje obrázek, který je vidět v úvodu tohoto článku.
$obrazek = zrcadliObrazek('img/mila.jpg', NULL, array(234, 234, 234));
header('Content-type: image/png');
imagepng($obrazek);
exit();
Funkce určitě není dokonalá, určitě by se dala vylepšit o spoustu maličkostí jako např. vykreslování rámečků, více druhů odlesků, samotné převrácení obrázku by se nemuselo dělat ručně, ale pomocí příslušné funkce knihovny ImageMagick, pokud by tato knihovna byla přítomná. Nicméně já potřeboval jen tuto funkčnost, takže jsem další možnosti už neimplementoval…
Tweet
Zkousel jsi jak moc to zpomali nacitani stranky? Je to vhodne do e-shopu? Nenasel jsem jine reseni nez tohle..
To jsem nezkoušel. Ale ten obrázek s odrazem můžeš vygenerovat jen 1x při vkládání položky zboží do shopu a uložit si ho. Pak už bys ho jen zobrazoval…