Jednoduché grafické počítadlo návštěv v PHP

21. ledna 2004

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ší…

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

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

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

2 komentářů

  1. gary90

    Srp 19, 2009 v 14:36

    nevím zda to tak má být ale nezdá se mi

    přesnějí include („fce,php“); ==> include („fce.php“); ???

    Odpovědět
  2. Petr Heller

    Srp 19, 2009 v 14:59

    Děkuji za upozornění. V minulé verzi Intervalu.cz byl kód určitě správně, možná došlo k  nějaké transforamci při převodu na nový RS.

    Díky a s pozdravem

    Petr Heller
    http://www.inak.cz

    Odpovědět

Napsat komentář: gary90 Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *