Tento článek bude užitečný především těm, kdo mají na internetu své fotogalerie, nebo se chystají něco podobného naprogramovat. Ostatně návod na jednu variantu obrázkové galerie máte přímo zde na Webtipu. O co jde? Každého, kdo si bude chtít umístit na internet své obrázky, potká situace, kdy si bude muset vytvořit z oněch obrázků náhledy (zmenšeniny). O tom, že to je pracná záležitost se tu nemá cenu rozepisovat. Proto také vznikla řada programů, které mají tvorbu náhledů usnadnit. Jako jeden příklad za všechny mohu uvést například program ACDSee, který je mimo jiné výborný prohlížeč obrázků. Někdo by teď mohl předhodit otázku: "Je možné obrázky zmenšovat pomocí PHP?" Samozřejmě. A o tom dnešní článek bude. Jeden můj kolega tu před časem podobnou situaci se zmenšováním obrázků probíral. Jeho skript fungoval tak, že z obrázků uložených v adresáři udělal zmenšeniny, které potom uložil do jiného adresáře. Stručné a jednoduché. Já jsem tento proces obohatil ještě o pár maličkostí, které doufám přijdou některým vhod. Před samotným zmenšováním se vám otevře formulář, kde si budete moci navolit některé podmínky, jako například vytvoření progresivních (prokládaných) náhledů, zobrazení výsledných obrázků po ukončení běhu skriptu nebo si budete moci nastavit i požadovanou kvalitu obrázků. Princip pak zůstává stejný.
Začnu tedy skriptem. Celý php kód jsem rozdělil na dvě části - část, která se provede po odeslání formuláře a má za účel zjistit hlavní proměnné, jež pak předá funkci, no a samotnou funkci, která obrázky zmenšuje. Toto je část první:
if ($resize == "OK"):
set_time_limit(60);
DL("php_gd.dll"); //načtení DLL knihovny pro práci s obrázky
include "conf.php";
$dp = OpenDir($cur_dir); //nastaveni adresare - vraci ukazatel $dp
$i = 0;
$soubor[$i] = ReadDir($dp);
while ($soubor[$i] == true): //vypis vsech souboru v nastavenem adresari
$pis = ReadDir($dp);
$i++;
$soubor[$i] = $pis; //$soubor[2] je prvnim souborem v adresari
endwhile; //zachována promenna $i, ktera je pocet souboru +2
CloseDir($dp);
for ($y=2; $y<=$i-1; $y++):
$size[$y] = GetImageSize($cur_dir."/".$soubor[$y]);
$width = $size[$y][0];
$height = $size[$y][1];
if ($new_width <= $new_height):
$widthto = $new_width;
$ratio = $width/$widthto;
$heightto = Ceil($height/$ratio);
else:
$heightto = $new_height;
$ratio2 = $height/$heightto;
$widthto = Ceil($width/$ratio2);
endif;
$outfile = Str_Replace(" ", "_", $soubor[$y]);
$outfile = strtr($outfile, "áčďěéíňřšťůúýžüäëö", "acdeeinrstuuyzuaeo");
$outfile = StrToLower($outfile);
resize($soubor[$y], "small_".$outfile, $widthto, $heightto, $quality, $show, $interlace);
endfor;
endif;
| |
Funguje to tak, že po odeslání formuláře se načte potřebná DLL knihovna a nezbytné proměnné ze souboru conf.php - jsou vlastně jen 2 - určení adresáře s originálními obrázky a adresáře, kam se uloží náhledy. Následuje cyklus, ve kterém se do pole $soubor uloží názvy souborů obrázků. V dalším cyklu se zjistí originální velikosti obrázků v pixelech a porovnají se uživatelem zadané hodnoty, podle kterých se obrázky zmenší buď na výšku, nebo na šířku. Ještě nahradíme některé nebezpečné znaky v názvech souborů a můžeme přistoupit k funkci, která obrázky zmenší. Tady je:
function resize($cur_file, $copy_file, $widthto, $heightto, $quality, $show, $interlace)
{
include "conf.php";
$ssize=GetImageSize($cur_dir."/".$cur_file);
$end = Explode(".", $cur_file);
if ((strtolower($end[1]) == "jpg") || (strtolower($end[1]) == "jpeg")):
$fp = imagecreatefromjpeg ($cur_dir."/".$cur_file);
$fx = imagecreate ($widthto,$heightto-1);
imagecopyresized ($fx,$fp,0,0,0,0,$widthto,$heightto,$ssize[0],$ssize[1]);
if ($interlace == "on"): ImageInterlace($fx , 1); endif;
imageJPEG ($fx, $copy_file, $quality);
Copy($copy_file, $copy_dir."/".$copy_file);
unlink($copy_file);
ImageDestroy($fp);
ImageDestroy($fx);
$kilo = Round(FileSize($copy_dir."/".$copy_file)/1024, 2);
echo "<div align=\"center\"><b>".$cur_file." => ".$copy_file."</b><br><b>".$widthto." X ".$heightto." px ; ".$kilo." Kb</b><br></div>";
if ($show == "on"): echo "<div align=\"center\"><img src=\"resized/".$copy_file."\"><br><br></div>"; endif;
elseif (strtolower($end[1]) == "png"):
If ( @$fp = imagecreatefrompng ($cur_dir."/".$cur_file) ):
$fx = imagecreate ($widthto,$heightto-1);
imagecopyresized ($fx,$fp,0,0,0,0,$widthto,$heightto,$ssize[0],$ssize[1]);
if ($interlace == "on"): ImageInterlace($fx , 1); endif;
imagePNG ($fx, $copy_file, $quality);
Copy($copy_file, $copy_dir."/".$copy_file);
unlink($copy_file);
ImageDestroy($fp);
ImageDestroy($fx);
$kilo = Round(FileSize($copy_dir."/".$copy_file)/1024, 2);
echo "<div align=\"center\"><b>".$cur_file." => ".$copy_file."</b><br><b>".$widthto." X ".$heightto." px ; ".$kilo." Kb</b><br></div>";
if ($show == "on"): echo "<div align=\"center\"><img src=\"resized/".$copy_file."\"><br><br></div>"; endif;
else:
echo "<div align=\"center\" style=\"color: red;\">Your version of GD library doesn't support PNG images.<br>Image <b>".$cur_file."</b> wasn't resized. Sorry.<br><br></div>";
endif;
endif;
}
| |
Jak vidíte, funkce je rozdělená na 2 části - jedna pro obrázky ve formátu PNG a druhá pro JPG. Podpora GIFů byla v PHP odebrána, tak proto tu o gifech nic není. Typ obrázku zjistíme podle přípony, kde se pomocí funkce Explode oddělí název od přípony (separátor bude logicky tečka). Dále je už skript vcelku jednoduchý. Pomocí dvou image-funkcí (imagecreatefromjpeg() a imagecopyresized()) daný obrázek zmenšíme a dále pak pokud je zvoleno vytvoření progresívních obrázků, využijeme funkci ImageInterlace() a obrázky převedeme. Kvalitu obrázku nastavíme ve funkci imageJPEG() nebo imagePNG(). Následuje už jen zkopírování obrázků do požadovaného adresáře, uvolnění paměti pomocí ImageDestroy() a vypsání informací na obrazovku. Pokud si uživatel zvolí zobrazení zmenšených obrázků, tak je vyhodíme na obrazovku spolu s informacemi. Tímto je jeden cyklus hotov a může se přistoupit ke zmenšení případných dalších obrázků.
Myslím, že celý skript je vcelku přehledně sestavený, tak by jeho pochopení a používání nemělo dělat problémy. Komplikace by mohly nastat v případě, kdy byste neměli správnou knihovnu pro práci s PNG a JPG obrázky. To vám nezbude nic jiného, než si příslušné soubory stáhnout z internetu. V tomto článku je to všechno. Máte-li zájem o zdrojáky - JSOU ZDE. Příště chystám další specialitu - zápis copyrightů na originální obrázky. ;) Víc neprozradím...nechte se překvapit.
Čevelíček Marek
|