Source for file RECaptcha.class.php
Documentation is available at RECaptcha.class.php
* Két féle üzemmódot felváltva használó Captcha.<br />
* 1. Random karakterek felismerése<br />
* 2. Egyszerű matematikai művelet megoldása.<br />
* Ezen kívül két féle módon jeleníthető meg. Egy részt kép típusú fájlban
* {@example examples/image.php}
* Más részt html kódba ágyazva, a kép forrását base64 kódolással
* az img tag src tulajdonságába helyezve
* {@example examples/html.php}
* @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
* @copyright Copyright (C) 2010, Takács Ákos
* @license http://www.gnu.org/licenses/gpl.html
* Két féle üzemmódot felváltva használó Captcha.<br />
* 1. Random karakterek felismerése<br />
* 2. Egyszerű matematikai művelet megoldása.<br />
* Ezen kívül két féle módon jeleníthető meg. Egy részt kép típusú fájlban
* {@example examples/image.php}
* Más részt html kódba ágyazva, a kép forrását base64 kódolással
* az img tag src tulajdonságába helyezve
* {@example examples/html.php}
* @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
* @copyright Copyright (C) 2010, Takács Ákos
* A kép típusa (jpeg, png, gif)
protected $type =
'jpeg';
* Háttérszín RGB összetevői: R,G,B formátumban
* Betűtípus ttf fájljának útvonala
* Háttérzavarás intenzitásának beállítása
* A karakterek előttizavaró jelek intenzitása
* A Captcha által megjelenített képre adandó válasz értéke.
* Matematikai művelet esetén annak megoldása, karakterek
* esetén a megjelenített karakterek.
* {@link __toString()} -ben generált html img tag plusz paraméterei<br />
* $params = array('style'='width: 300px;', 'onclick'=>'eventHandler();');
* Ezen nevű session változóba teszi be a captcha -ra adandó válasz értékét.
* Ezt lehet majd felhasználni az ellenőrzésnél.
* Karakterek közti minimális és maximális távolság pixelben
* A tömb első és második elemei sorrendben.
* Captcha létrehozása különböző opciókkal. Az opciókról részletesebben a
* {@link setProperties()} metódus dokumentációjánál.
* Captcha opcióinak beállítása
* @param array $options Opciók asszociatív tömbje. Az opciók a következők
* <li><b>session_name:</b> {@link $session_name} </li>
* <li><b>params:</b> {@link $params}</li>
* <li><b>type:</b> {@link $type}</li>
* <li><b>width:</b> {@link $width}</li>
* <li><b>height:</b> {@link $height}</li>
* <li><b>bgcolor:</b> {@link $bgcolor}</li>
* <li><b>fonttype:</b> {@link $fonttype}</li>
* <li><b>bgintensity:</b> {@link $bgintensity}</li>
* <li><b>fgintensity:</b> {@link $fgintensity}</li>
* <li><b>fontsize:</b> {@link $fontsize}</li>
* <li><b>spacerange:</b> {@link $spacerange}</li>
if (isset
($options['session_name']))
if (isset
($options['params']))
$this->params =
$options['params'];
if (isset
($options['type']))
$this->type =
$options['type'];
if (isset
($options['width']))
$this->width = (int)
$options['width'];
if (isset
($options['height']))
$this->height =
$options['height'];
if (isset
($options['bgcolor']))
$this->bgcolor =
$options['bgcolor'];
if (isset
($options['fonttype']))
if (isset
($options['bgintensity']))
if (isset
($options['fgintensity']))
if (isset
($options['fontsize']))
$this->fontsize = (int)
$options['fontsize'];
if (isset
($options['spacerange']) and
is_array($options['spacerange']) and count($options['spacerange']))
* @param bool $bool ha true, akkor nem küld Content-type header-t.
* Ez a {@link __toString()} metódusnál lényeges.
public function flush($bool=
false)
if($type ==
'jpg') { $type =
'jpeg'; }
if($type !=
'jpeg' and $type !=
'gif' and $type !=
'png') {
$this->source =
imageCreateTrueColor($this->width,$this->height);
$create_image =
'image'.
$this->type;
header("Content-type: image/$type");
$create_image($this->source);
* @param mixed $bgcolor Ha a második két paraméter is meg van adva,
* akkor az RGB színösszetevők vörös komponense. egyébként
* 2 formátum engedélyezett.
* <li><b>Decimális:</b> R,G,B</li>
* <li><b>Hexa:</b> #RGB</li>
* @param int $greenc RGB zöld komponense (decimális)
* @param int $bluec RGB kék komponense (decimális)
protected function setBackground($bgcolor,$greenc=
null,$bluec=
null)
//ha mind a három paraméter meg van adva
//ha csak az első paraméter van megadva
//akkor ha # jellel kezdődik
if(substr($bgcolor,0,1) ==
'#') {
//hexadecimális formátumnak tekinti.
//felbontja 3 részre és decimálisba váltja a részeket
$red_hex =
substr($bgcolor,1,2);
$green_hex =
substr($bgcolor,3,2);
$blue_hex =
substr($bgcolor,5,2);
//vesszök mentén 3 részre vágja a színt (rgb)
$bgcolor =
imageColorAllocate($this->source,$red,$green,$blue);
* @param int $intensity Torzítás erőssége
for($i=
1;$i<=
$intensity;$i++
) {
//akkor elipsziseket rajzol a háttérbe
//elipszis közepének X koordinátája
//elipszis közepének Y koordinátája
//elipszis színének random választása
$color =
imageColorAllocate($this->source,$ellipse_red,$ellipse_green,$ellipse_blue);
//színek ranfom választása
$color =
imageColorAllocate($this->source,$line_red,$line_green,$line_blue);
imageline($this->source,$x1,$x2,$y1,$y2,$color);
* Captcha kód generálása a képre
* @param int $fontsize Betűméret
* @return string A szükséges válasz {@link $text}
exit('<b>'.
$this->fonttype.
'</b> not found!');
//akkor karaktersorozatot generál
//generálható karakterek listája
foreach($keys as $key=>
$value) {
$text[] =
$chars[$value];
$textLength =
count($text);
//karakterek generálása ciklusban
for($i=
0;$i<
$textLength;$i++
) {
//karakter szögelfordulása
$angles[$i] =
$angles[$i] %
20;//mt_rand(1,20);
//ha páros, akkor negatívra állítja
if($angles[$i] %
2 ==
0) { $angles[$i] =
0-
$angles[$i]; }
//karakter által elfoglalt terület koordinátái
$height =
abs($ttfbox[$i][1]) +
abs($ttfbox[$i][7]);
$leftx =
max(abs($ttfbox[$i][0]),abs($ttfbox[$i][6]));
$maxleftx +=
$leftx+
$rightx+
$space;
$rightx =
max(abs($ttfbox[$i][2]),abs($ttfbox[$i][4]));
//karakter X koordinátájának megadása
//betüköz megadása ha nem az utolsó betűrúl van szó
//legmagasabb betű meghatározása
$max_height =
($height >
$max_height) ?
$height :
$max_height;
//betük középre igazítása függőlegesen
$y =
(($this->height -
$max_height) /
2) +
$max_height;
//karaktersorozat középre igazítása vizszintesen
$offset =
($this->width -
(end($x)+
$rightx)) /
2;
for($i=
0; $i<
$textLength;$i++
) {
$color =
imageColorAllocate($this->source,mt_rand(0,255),255-
mt_rand(170,255),255);
//visszaadja a kiiírt szöveget
//ha a generált szám nem 0
$operators =
array('x'=>
'0','+'=>
'1','-'=>
'2');
//és az első operandus 100-nál kisebb
//a második operandus max
} else if($operator ==
'+') {
//a második operandus lehet 10 is
} else if($operator ==
'-') {
//a második operandus max 5 lehet
//második operandus megadása
$eredmeny =
$operandus1 *
$operandus2;
} else if($operator ==
'+') {
$eredmeny =
$operandus1 +
$operandus2;
} else if($operator ==
'-') {
$eredmeny =
$operandus1 -
$operandus2;
//a megjelenítendő szöveg összerakása
$text =
$operandus1 .
' '.
$operator .
' '.
$operandus2 .
' = ? ';
//befoglaló téglalap koordinátái
//középre állítás vizszintesen
$x =
(($this->width -
(abs($ttfbox[0]) +
abs($ttfbox[2])) ) /
2 ) +
abs($ttfbox[0]);
//középre állítás függőlegesen
$y =
(($this->height -
(abs($ttfbox[1]) +
abs($ttfbox[7])) ) /
2) +
abs($ttfbox[7]);
$color =
imageColorAllocate($this->source,255,0,255);
//visszaadja a beirandó eredményt
return (string)
$eredmeny;
* A kép html img tagba helyezve base64 encode-olással.
foreach ($this->params as $key=>
&$param)
$params .=
$key.
'="'.
$param.
'" ';
return '<img src="data:image/'.
$this->type .
';base64,'.
base64_encode($src).
'" '.
$params .
' />';
Documentation generated on Mon, 29 Mar 2010 19:52:11 +0200 by phpDocumentor 1.4.1