Tento článek navazuje na minulý díl, kde jsme si udělali skript na automatické generování HTML galerie obrázků. Problém je ale v tom, že pro každý obrázek je potřeba udělat jeho náhled a tudíž nový soubor. Obvykle se to dělá v nějakém grafickém programu, což je činnost docela časově náročná. Podívejme se tedy na skript, který dobu desítek minut i případně několika hodin zkrátí na vteřiny.

Zzákladním předpokladem pro fungování tohoto skriptu je, že máme PHP s podporou GD. Ve Windows se tento problém dá vyřešit přidáním tohoto řádku na začátek souboru se skriptem: dl(„php_gd.dll“); a na Unixu pak takto: dl(„gd.so“);. Samozřejmě musíte dodat správnou cestu k souborům.

Jako minule, tak i teď uvedu zdrojový kód, umístěný v souboru zmenseni.php, po ucelených částech, ve kterých vysvětlím, jak funguje. Musíte je tedy spojit a vložit do zmiňovaného souboru.

<html>
<head><title>Skript na zmenseni obrazku v galerii</title></head>
<body>
<?
if (isset($submit)) { // pokud je odeslan formular
$adresar = OpenDir($odkud); // otevreme adresar
$soubor = Array(); // zinicializujeme pole
while ($zaznam = ReadDir($adresar)) { cyklus nacita vsechny soubory
if (!Is_Dir(„$odkud/$zaznam“)) { // pokud nazev neni adresar, …
$soubor[] = $zaznam; // …, pridame jej do pole
}
}
CloseDir($adresar); // uzavreme adresar
Sort($soubor); // setridime soubory
// dalsi podminka urci ktere funkce budeme pouzivat
if ($typ == „gif“) { $vstup_funkce = ImageCreateFromGIF; $vystup_funkce = ImageGIF; }
elseif ($typ == „jpg“) { $vstup_funkce = ImageCreateFromJPEG; $vystup_funkce = ImageJPEG; }
elseif ($typ == „png“) { $vstup_funkce = ImageCreateFromPNG; $vystup_funkce = ImagePNG; }

Po klasickém HTML úvodu přichází kontrola, zda-li byl formulář odeslán, pokud nebyl, zobrazí se. Pokud byl odeslán, přikročí se k provádění samotnému zmenšování. Po úvodní podmínce si stejným způsobem jako v minulém díle načteme seznam souborů do pole $soubor. Nelekejte se těch tří podmínek, zjišťují, s jakým formátem si uživatel přeje pracovat a do proměnné $vstup_funkce a $vystup_funkce přiřadíme funkci specifickou pro zvolený grafický formát. Takováto proměnná se pak chová jako kdyby byla ta určitá přiřazená funkce. Má stejný počet parametrů i stejný výsledek.

Reset($soubor);
while ($zaznam = Current($soubor)) { // cyklus nacita postupne soubory
$img_zdroj = $vstup_funkce(„$odkud/$zaznam“); // nacteme obrazek ze souboru
$img_cil = ImageCreate($velx,$vely); // vytvorime prostor pro cilovy obrazek
ImageCopyResized($img_cil,$img_zdroj,0,0,0,0,$velx,$vely,ImageSX($img_zdroj),ImageSY($img_zdroj)); // zmensime obrazek
$vystup_funkce($img_cil,“$kam/$predpona$zaznam“); // zapiseme novy obrazek do souboru
ImageDestroy($img_zdroj); // uvolnime pamet zdrojoveho obrazku
ImageDestroy($img_cil); // uvolnime pamet ciloveho obrazku
Next($soubor);
}
echo „<center><h3>Konverze dokoncena!</h3></center>“;

Podívejme se na další kousek, tato část je tím kusem skriptu, kde skutečně dochází ke konverzi obrázků a proto se na ni podíváme podrobněji. Cyklus while() nám zajistí postupné načítání jmen souborů. Jak jsem už řekl, $vstup_funkce reprezentuje funkci ImageCreateFromGIF() resp. ImageCreateFromJPEG() nebo ImageCreateFromPNG(). Pro obrázek se musí vytvořit místo v paměti, to získáme pomocí zmíněných funkcí a reprezentuje jej proměnná $img_zdroj. Musíme taktéž vytvořit místo pro budoucí zmenšeninku a k tomu použijeme funkci ImageCreate(), které předáme parametry o velikosti obrázku. A teď funkce pro nás nejdůležitější: ImageCopyResized(). Tato funkce zkopíruje zdrojový obrázek do cíloveho, ale to není vůbec všechno co nabízí, dále zadáme jakou část vezme ze zdrojového obrázku a na jakou velikost se má upravit. Je možné obrázek také zvětšit, ale to je v našem případě k ničemu. PHP používá ke zmenšení poměrně jednoduchý postup a tudíž kvalita zmenšených obrázků není závratná, ale pro běžné galerie bohatě postačující.

Vraťme se ale zpět ke skriptu. Jako další přichází na řadu $vystup_funkce, která zastupuje jednu z ImageGIF(), ImageJPEG() nebo ImagePNG(). Tyto funkce slouží k zapsání obrázku na výstup. Jelikož jsme uvedli jako druhý parametr jméno souboru, bude výstup zapsán do něj. Na konec ještě uvolníme pamět, použitou pro uložení obrázku v paměti, funkcí Image_Destroy().

} else {
?>
<form>
Umisteni zdrojove galerie:<input type=text name=odkud><br>
Umisteni cilove galerie:<input type=text name=kam><br>
Sirka:<input type=text name=velx><br>
Delka:<input type=text name=vely><br>
Vstupni a vystupni typ:<select name=typ>
<option selected value=gif>GIF</option>
<option value=jpg>JPEG</option>
<option value=png>PNG</option>
</select><br>
Predpona<input type=text name=predpona><br>
<input type=submit name=submit value=odeslat>
</form>
<? } ?>
</body>
</html>

Tahle poslední část už neni z PHP hlediska ničím zajímavá, jen se zde provede zobrazení HTML formuláře, pokud jsme jej už neodeslali.

A máme to za sebou, ještě bych rád podotknul že podpora formátu GIF byla v GD 1.6 vyjmuta a nahrazena podporou PNG. Pokud chcete používat soubory GIF sežeňte si GD knihovnu 1.3 – 1.5. Teď už vám jen přeju hodně obrázků a co největší návštěvnost vašich galerií, ať už to budou obrázky aut, krajin atd.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

3 Příspěvků v diskuzi

  1. Dobry den .
    Chcem sa vas spytat preco pri zmensovani obrazku dochadza k strate kvality ?Ako by sa to dalo riesit ?
    Dakujem

Odpovědět