Efekt zrcadlení obrázku v PHP — Jasperův zápisník

Přejít na obsah | Přejít na menu


Efekt zrcadlení obrázku v PHP

Čas 15. 11. 2008 v 19.06 Kategorie 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…

Vstupní obrázek Výstupní obrázek
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…


Tento příspěvek byl publikován dne 15. 11. 2008 v 19:06 v rubrice Programování.
Komentáře můžete sledovat přes RSS 2.0 kanál.
Můžete zanechat komentář nebo trackback z vašeho webu.

2 komentářů k příspěvku “Efekt zrcadlení obrázku v PHP”

  1. b0b1k napsal:

    Zkousel jsi jak moc to zpomali nacitani stranky? Je to vhodne do e-shopu? Nenasel jsem jine reseni nez tohle..

  2. Jasper napsal:

    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…

Zanechte komentář

Avatary zajišťovány službou Gravatar.
Váš první komentář musí schválit správce, další již lze psát volně.