Navigace

Hlavnφ menu

 

JednoduchΘ grafickΘ poΦφtadlo nßvÜt∞v v PHP

AΦkoli doba nejv∞tÜφ slßvy grafick²ch poΦitadel nßvÜt∞vnosti ji₧ dßvno pominula a souΦasn² webdesign spolΘhß spφÜe na poΦitadla textovß (pokud je ze strßnek nevynechßvß zcela), m∙₧e se vßm znalost funkce, vytvß°ejφcφ takovΘho obrßzkovΘ poΦitadlo, obΦas docela hodit. A prßv∞ o tom je tento Φlßnek.

Zßkladnφm p°edpokladem pro vznik grafickΘho poΦitadla je existence grafick²ch soubor∙ (samotn²ch Φφslic), kterΘ funkce slouΦφ do jednoho grafickΘho souboru a ten pak odeÜle klientovi. VÜechny soubory musφ mφt stejnΘ rozm∞ry (funkce si je sama zjistφ), musφ b²t formßtu PNG (na jin² typ by se funkce musela trochu upravit) a jejich nßzvy musφ b²t "0.png", "1.png" a tak dßle a₧ k "9.png". Jestli₧e navφc p°idßme do adresß°e s Φφslicemi soubory "LeftSide.png" a "RightSide.png", pak je naÜe funkce p°idß na pravou a levou stranu v²slednΘho obrßzku, Φφm₧ vytvo°φ rßmeΦek.

Funkci jsem pojmenoval Number2Img, co₧ pln∞ vystihuje jejφ funkci. Na vstupu je adresß° s obrßzky Φφslic (bez koncovΘho lomφtka) a Φφslo. Jestli₧e se obrßzky nachßzφ ve stejnΘm adresß°i jako naÜe funkce, parametr $cesta zadßvat nemusφme.

function Number2Img ($cislo,$cesta=""){

   // kdy₧ se zadß cesta, p°idßme koncovΘ lomφtko
   $cesta="" ? $cesta="" : $cesta.="/";

   // jmΘna okraj∙
   $lside=$cesta."LeftSide.png"; // lev² okraj
   $rside=$cesta."RightSide.png"; // prav² okraj

   // podle obrßzku na kterΘm je Φφslice 1 zjistφme Üφ°ku a v²Üku; tento obrßzek musφ existovat!
   list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($cesta."1.png"); // tato funkce vracφ pole: index 0-Üφ°ka,1-v²Üka,2-typ (nap°.: "image/png") a 3-atribut tagu img (nap°.:"height=200 width=200")
   $number_width=$pic_width; // Üφ°ka jednΘ Φφslice
   $Image_Height=$pic_height; // v²Üka jednΘ Φφslice=v²Üka celΘho obrßzku

   // jestli₧e existuje lev² okraj, zjistφme si jeho Üφ°ku
   if (is_file($lside)){
      list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($lside);
      $lside_width=$pic_width;
   } else {
      $lside_width=0;
   }

   // jestli₧e existuje prav² okraj, zjistφme si jeho Üφ°ku
   if (is_file($rside)){
      list($pic_width, $pic_height, $pic_type, $pic_attr) = getimagesize($rside);
      $rside_width=$pic_width;
   } else {
      $rside_width=0;
   }

   // zjistφme si poΦet Φφslic v Φφsle
   $Digits_Count = strlen($cislo);

   // celkovß Üφ°ka obrßzku se vypoΦte jako souΦin Üφ°ky obrßzku a poΦtu Φφslic + Üφ°ky p°φpadn²ch okraj∙
   $Image_Width = (($Digits_Count * $number_width) + $lside_width + $rside_width);

   // vytvo°φme prßzdn² obrßzek
   $Image = imagecreatetruecolor($Image_Width,$Image_Height);

   // P°idßme lev² okraj do obrßzku, kdy₧ existuje
   if (is_file($lside)){
      $image_LeftSide = imagecreatefromPNG($lside);
      imagecopy($Image, $image_LeftSide, 0, 0, 0, 0, $lside_width, $Image_Height);
      imagedestroy($image_LeftSide);
   }

   // P°idßme prav² okraj do obrßzku, kdy₧ existuje
   if (is_file($rside)){
      $image_RightSide = imagecreatefromPNG($rside);
      imagecopy($Image, $image_RightSide, ($Image_Width - $rside_width), 0, 0, 0, $rside_width, $Image_Height);
      imagedestroy($image_RightSide);
   }

   // projdeme vÜechny Φφslice v °et∞zci a vlo₧φme je do v²slednΘho obrßzku
   for($pozice=0; $pozice < $Digits_Count; $pozice++) {
      // zjiÜt∞nφ prßv∞ zpracovßvanΘ Φφslice
      $digit = substr($cislo,$pozice,1);

      // cesta prßv∞ zpracovßvanΘ Φφslice
      $digit_name = $cesta. $digit . ".png";

      // zkontrolujeme, zda Φφslice existuje, kdy₧ ne, v celkovΘm obrßzku z∙stane mezera
      if (is_file($digit_name)) {
         // v²poΦet pozice prßv∞ zpracovßvanΘ Φφslice
         $digit_pozition = (($pozice*$number_width)+$lside_width);

         // p°eΦteme prßv∞ zpracovßvanou Φφslici
         $digit_image = imagecreatefromPNG($digit_name);

         // vlo₧φme Φφslici do celkovΘho obrßzku
         imagecopy($Image, $digit_image, $digit_pozition, 0, 0, 0, $number_width, $Image_Height);

         // odstranφme z pam∞ti obrßzek prßv∞ zpracovanΘ Φφslice
         imagedestroy($digit_image);
      }
   }

   // odeÜleme hlaviΦku, kterß klientovi °ekne typ odesφlan²ch dat
   header("Content-Type: image/png");

   // poÜleme obrßzek klientovy
   imagePNG($Image);

   // nakonec odstranφme obrßzek z pam∞ti, aby jsme ji nezahltili
   imagedestroy($Image);

   }

M∙₧ete si vyzkouÜet funkΦnφ ukßzku (zdroj), mßte-li zßjem. Do textboxu zadejte Φφslo, vyberte styl a stiskn∞te "OK". Zobrazφ se vßm zadanΘ Φφslo v grafickΘ podob∞.

V praxi bychom volali soubor, zpracovßvajφcφ poΦitadlo nap°φklad pomocφ <img src="pocitadlo.php">, p°iΦem₧ do volanΘho souboru bychom vlo₧ili k≤d, kter² by vrßtil poΦet nßvÜt∞v (nap°φklad z databßze) a zφskanou hodnotu pou₧il jako parametr "$cislo" funkce Number2Img:

<?
   // nejprve vlo₧φme samotnou funkci
   include ("fce,php");

   // kod, kter² nastavφ prom∞nnou $pristupy
   .
   .
   .

   // nakonec funkci zavolßme. Bude odeslßn obrßzek s Φφslem.
   Number2Img($pristupy)
?>

A ·pln∞ na zßv∞r jeden tip. Popisovanß funkce se dß pou₧φt i pro p°evod textu, pokud jφ poskytnete p°φsluÜnΘ soubory, tedy "A.png", "B.png" a dalÜφ...

Heller, Petr (20.1. 2004)