Grafika publishing webtip.cz grafika.cz mujiPod.cz mujmac.cz fotografovani.cz printing.cz builder.cz galerie
webtip.cz
adresář  | práce  | diskuse  | redakce  | inzerce
 
 


  Zmenšování obrázků pomocí PHP
o autorovi 
poslat mailem 
tisknout článek 
aktuální rubrika 
Zmenšovat obrázky tak, aby byly použitelné jako náhledy do obrázkových galerií umí mnoho programů. Jde to i pomocí PHP a podle následujícího článku to zvládne každý.

Čevelíček Marek - 23.07.2002 - clanek - Rubrika: PHP

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


Hodnocení článku: -1- -2- -3- -4- -5-  Aktuální hodnocení: 2.80 (3270)

Relevantní články
Žádné články


Příspěvky do diskuse o aktuálním článku
peta29.07.10:06zmensovani - moje funkce s BMP PNG GIF BMP
Tomas09.10.22:56dík za tip
Marek Cevelicek10.10.13:42RE: dík za tip
Yagi24.07.22:30funkce na zensovani
Marek25.07.18:31RE: funkce na zensovani
Jirka Kocman28.07.23:11RE: RE: funkce na zensovani
Marek30.07.19:52RE: RE: RE: funkce na zensovani
Radek01.11.13:35Link
Marek Cevelicek10.10.13:46RE: Link
Petr Cada25.11.15:12RE: RE: Link
Marek Cevelicek25.11.16:10RE: RE: RE: Link
martin11.05.8:10RE: RE: RE: RE: Link
UFon18.01.21:22RE: RE: RE: RE: RE: Link
qw15.08.3:29RE: RE: RE: RE: RE: RE: Link
Marek23.02.15:31RE: RE: RE: RE: RE: RE: RE: Link
Seb26.01.13:34RE: RE: RE: RE: RE: RE: RE: RE: Link
Wood09.02.19:35RE: RE: RE: RE: RE: RE: RE: RE: RE: Link
  

 

  O vydavateli | Kontakt | Ceník reklamy | Ochrana osobních dat
©2002 Grafika Publishing. Všechna práva vyhrazena!