<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC '-//W3C/DTD XHTML+Voice 1.2 /EN' 'http://www.voicexml.org/specs/multimodal/x+v/12/dtd/xhtml+voice12.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ev='http://www.w3.org/2001/xml-events'>
<head>
<link rel='stylesheet' href='http://pabi3.com/modules/items/voice.css' type='text/css' media='all' />
<form xmlns='http://www.w3.org/2001/vxml' id='title'>
<block>
The article GD v praxi - Overovaci kod v obrazku is written by Los.Pavlos
</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='body'>
<block>
Po serialy "Praca s GD kniznicou" prichadza novy clanok a to PHP v praxi. Cielom bude dosiahnut odoslanie dat prostrednictvom formularu, ktore bude fungovat iba v pripade, ak opisete s obrazku nahodne vygenerovany text.</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='full'>
<block>

Jelikoz jsme si toho o GD rekli uz dost meli bychom  prejit k prikladum v praxi. Jiste znate napr. pri prihlasovani, psani komentare, ze je tam obrazek, z ktereho musite opsat text aby jste mohli dale pokracovat. Tak presne toto si dnes udelame. 
Budeme k tomu potrebovat obrazek pojmenovany pozadi2.png, pravdepodobne i font 
arial.ttf (naleznete ve slozce s windows/fonts) a trochu casu.

Pozadi2.png


Budeme pouzivat par funkci, o kterych jsme si jeste nerekli. A to rand a char.

Rand (od, do)
Funkce generuje nahodne cislo v zadanem rozmezi.

Char (cislo)
Funkce prevede cislo na znak podle ascii tabulky. V ascii tabulce je kazdy znak reprezentovan nejakym cislem. ASCII tabulkou se dale nebudu zabyvat (to neni naplni tohoto clanku). Tuto funkci pouzijeme proto, ze funkce rand dokaze generovat pouze nahodne cislo. A mi potrebujeme i pismena A-Z, a-z.
Zde vidite tabulku bez netisknutelnych znaku (proto zacina az cislem 32)

A jdeme na to&#8230;...

&lt;?php

session_start();

$obrazek = imagecreatefrompng(&quot;pozadi2.png&quot;);

Jelikoz nejak musime overit, zdali bylo zadano spravne heslo pouzijeme pro to
session. Vytvorime obrazek z naseho pozadi2.png.

for ($i=0;$i&lt;5;$i++)

{

while(strlen($str)!=1){

$random=rand(48,123);

if( ($random&gt;47 &amp;&amp; $random&lt;58) || ($random&gt;96 &amp;&amp; $random&lt;123) ||

($random&gt;64 &amp;&amp; $random&lt;91) ){

$str.=chr($random);

}

} 

$text .= $str;

$textcolor = imagecolorallocate($obrazek,rand(0,130),rand(0,130),rand(0,130));



imagettftext ($obrazek,rand(15,25),rand(-45,45),15+($i*38),35, $textcolor,&quot;arial.ttf&quot;,$str) ;



$str = NULL;

}

Nasleduje cyklus for, ktery nam zajisti vygenerovani 5 znaku do obrazku. Cyklus
While se bude provadet tak dlouho dokud se do $radon nevygeneruje cislo ktere
podle ascii prestavuje nami pozadovane znaky. Kdyz se vygeneruje spravne cislo
provede se $str.=chr($random); coz nam do $str priradi znak z vygenerovaneho
cisla podle ascii. Kdyz uz se to provede prida se pismeno do promenne $text
(abychom i na konci cyklu for vedeli jaky text jsme vygenerovali. Pote se provede
imagecolorallocate kde se pomoci funkce rand vygeneruji hodnoty pro barvu
(abychom v obrazku meli ruzne barvy). No a nakonec se to vypise velikosti 15-25,
pod uhlem -45° az 45° fontem arial. $str se vynuluje a to cele se opakuje 5*.

$_SESSION['string']=$text;

header(&quot;Content-type: image/png&quot;);

imagepng($obrazek);

imagedestroy ($obrazek)

?&gt;>

Nyni se do session ulozi $text ve ktere je zapsan cely vygenerovany text. Odesle
se hlavicka, obrazek a uvolni se systemove prostredky. Tak a mame cely kod na
generovani obrazku. 

Jedinou chybu na krase to ma ze diky odesilani session nemuzeme pred kod dat nic
jineho. Takze kod je jeste potreba trochu upravit, aby se session mohlo odeslat
i kdyz je kod treba v formulari. To uz necham na vas&#8230;. Nasledujici kod predstavuje
jak by jste to mohli udelat.

&lt;?php

session_start();

if (!isset($_GET['generuj'])) {

for ($i=0;$i&lt;5;$i++)

{

while(strlen($str[$i])!=1){

$random=rand(48,123);

if( ($random&gt;47 &amp;&amp; $random&lt;58) || ($random&gt;96 &amp;&amp; $random&lt;123) ||

($random&gt;64 &amp;&amp; $random&lt;91) ){

$str[$i] = chr($random);

}

}



$text .= $str[$i];



}

$_SESSION['string']= $text;

$GLOBALS['text'] = $text;

}





elseif (isset($_GET['generuj'])){

$GLOBALS['text'] = $_SESSION['string'];

$obrazek = imagecreatefrompng(&quot;pozadi2.png&quot;);

for ($i=0; $i&lt;5; $i++){



$textcolor = imagecolorallocate($obrazek,rand(0,130),rand(0,130),rand(0,130));

$pismenko = substr($GLOBALS['text'],0+$i,1);





imagettftext ($obrazek,rand(15,25),rand(-45,45),15+($i*38),35, $textcolor,&quot;arial.ttf&quot;,$pismenko) ;

}

header(&quot;Content-type: image/png&quot;);

imagepng($obrazek);

imagedestroy ($obrazek);

exit();

};

?&gt;



&lt;?php echo '&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-2&quot;?&gt;'; ?&gt;

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd&quot;&gt;

&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;cz&quot;&gt;





&lt;head&gt;

&lt;!-- meta tags and language --&gt;

&lt;meta http-equiv=&quot;content-language&quot; content=&quot;cz&quot; /&gt;

&lt;meta name=&quot;language&quot; content=&quot;cz&quot; /&gt;

&lt;meta name=&quot;document-language&quot; content=&quot;cz&quot; /&gt;

&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=ISO-8859-2&quot; /&gt;



&lt;title&gt;Ukazkovy formular&lt;/title&gt;



&lt;/head&gt;



&lt;body&gt;



&lt;form method=&quot;post&quot; action=&quot;kontrola.php&quot;&gt;

&lt;fieldset&gt;

&lt;img src = &quot;formular.php?generuj&quot; alt=&quot;code&quot;/&gt;&lt;br/&gt;

Opis kod:&lt;input type=&quot;text&quot; name=&quot;kod&quot; size=&quot;24&quot;/&gt; &lt;br/&gt;

Vase zprava:&lt;br/&gt;

&lt;textarea rows=&quot;7&quot; name=&quot;text&quot; cols=&quot;31&quot;&gt;&lt;/textarea&gt;&lt;br/&gt;

&lt;input type=&quot;submit&quot; value=&quot;Odeslat&quot; name=&quot;odeslat&quot;/&gt;

&lt;input type=&quot;reset&quot; value=&quot;Obnovit&quot; name=&quot;obnovit&quot;/&gt;

&lt;/fieldset&gt;

&lt;/form&gt;

&lt;/body&gt;

&lt;/html&gt;

A nakonec jen soubor kontrola.php
Zde staci dat neco ve smyslu.

&lt;?

if( $_SESSION['string'] == $_POST['kod'] )

{

echo 'Ano kod jsi opsal spravne. Gratuluji';

// vase zpracovani zpravy

}

else

{

echo 'Spamery nemam rad.... Zadal jsi spatny kod';

}

?&gt;

Vysledky(priklady):


A na uplny zaver si zde muzete stahnout cely skript i s pokusnym formularem.
Nebo se na skript podivat na: http://vyrvarimweb.wz.cz/formular.php(formular)
a http://vyrvarimweb.wz.cz/kod.php (jen generovani obrazku).
Cely zdrojovy kod si muzete stahnout zde.</block>
</form>
<base href='http://pabi3.com/' />
<title>GD v praxi - Overovací kód v obrázku</title>
</head>
<body ev:event='load' ev:handler='#title'>
<a href='http://pabi3.com/blog/gd-v-praxi-overovaci-kod-v-obrazku/' title='Návrat'>Návrat</a>
<h1 style='padding:0.5em;'>GD v praxi - Overovací kód v obrázku</h1>
<ul>
<li ev:event='click' ev:handler='#body'>Speak introduction</li>
<li ev:event='click' ev:handler='#full'>Speak full</li>
</ul>
</body>
</html>
