Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

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.


Reklama


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.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

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

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.