interval.cz

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

21. 01. 2004 | Petr Heller | PHP | Komentáře: 2

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.


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Komentáře ke článku

Přidat nový komentář

gary90

Autor komentáře: gary90

Datum vložení: 19. Srpen 2009, 14:36:40

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

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

Petr Heller

Autor komentáře: Petr Heller

Datum vložení: 19. Srpen 2009, 14:59:56

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

Zpět na začátek komentářů | Zpět na začátek článku

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena. Hosting zajišťuje CZECHIA.COM. SSL certifikáty pro domény. Powered by WordPress.