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.
// 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Üφ...