Hi alle
Ich hab eine neue Captcha Sicherung gebastelt und diese funktioniert auch soweit.
venum-lk.de/captcha/captcha.php?size=s
Nur hab ich das Problem, dass der Name der ersten Figur ab und zu außerhalb des Bildes beginnt, was meines erachtens aufgrund des Codes eigendlich nicht sein sollte.
Das Problem tritt hauptsächlich bei der Größe s auf (alle Größen: s, m, l, xl)
Kann mir da wer helfen?
Hier der Code
Alles anzeigen
Vielen Dank
daLu
Ich hab eine neue Captcha Sicherung gebastelt und diese funktioniert auch soweit.
venum-lk.de/captcha/captcha.php?size=s
Nur hab ich das Problem, dass der Name der ersten Figur ab und zu außerhalb des Bildes beginnt, was meines erachtens aufgrund des Codes eigendlich nicht sein sollte.
Das Problem tritt hauptsächlich bei der Größe s auf (alle Größen: s, m, l, xl)
Kann mir da wer helfen?
Hier der Code
Quellcode
- <?php
- // Schriftart (System-ID)
- $font = 4;
- session_start();
- unset($_SESSION['CAPTCHA']);
- // Wenn keine Größe angegeben wird
- if(!isset($_GET['size'])) $_GET['size'] = "l";
- // Das Hintergrundbild laden
- $im = imagecreatefrompng("bg_".$_GET['size'].".png");
- if(!$im) die("Fehler bei Bildauslesen");
- // Namen
- if(!@file_exists("names.php")) die("Namensliste nicht vorhanden");
- include "names.php";
- function randnum($start, $end) {
- $numbers = range($start, $end);
- srand((float)microtime() * 1000000);
- shuffle($numbers);
- return $numbers[0];
- }
- // Farben definieren
- $white = imagecolorallocate($im, 255, 255, 255);
- $black = imagecolorallocate($im, 0, 0, 0);
- // Die Abmessungen des Hintergrundbildes erfassen
- $width = imagesx($im);
- $height = imagesy($im);
- // verfügbare Breite für die drei Personen errechnen
- $spacex = $width / 3;
- $spacey = 150;
- // Bilder in den Verzeichnissen zählen (-2 wegen Navigationszeichen . & ..)
- $men = count(scandir("men/")) -2;
- $women = count(scandir("women/")) -2;
- // Namen zählen
- $names_m = count($names[0]) -1;
- $names_w = count($names[1]) -1;
- // Mann (0) oder Frau (1)
- $sex = randnum(0,1);
- // Position (1,2,3) auswählen
- $position = randnum(1,3);
- // Wenn Frau
- if($sex) {
- // Bilder in PHP einlesen
- $pic[1]['s'] = imagecreatefrompng("women/".randnum(1,$women).".png");
- $pic[2]['s'] = imagecreatefrompng("men/".randnum(1,$men).".png");
- $pic[3]['s'] = imagecreatefrompng("men/".randnum(1,$men).".png");
- // Frage erstellen
- $question = "Wie heißt die Frau auf diesem Bild?";
- // Name 1
- $name[1] = $names[1][randnum(0,$names_w)];
- // Wenn Mann
- }else{
- // Bilder in PHP einlesen
- $pic[1]['s'] = imagecreatefrompng("men/".randnum(1,$men).".png");
- $pic[2]['s'] = imagecreatefrompng("women/".randnum(1,$women).".png");
- $pic[3]['s'] = imagecreatefrompng("women/".randnum(1,$women).".png");
- // Frage erstellen
- $question = "Wie heißt der Mann auf diesem Bild?";
- // Name 1
- $name[1] = $names[0][randnum(0,$names_m)];
- }
- // falsche Namen ermitteln
- // Name 2
- $temp = randnum(0,1);
- $count = $names_m;
- if($temp) $count = $names_w;
- $name[2] = $names[$temp][randnum(0,$count)];
- // Name 3
- $temp = randnum(0,1);
- $count = $names_m;
- if($temp) $count = $names_w;
- $name[3] = $names[$temp][randnum(0,$count)];
- // Bildabmessungen (BxH) ermitteln
- $pic[1]['w'] = imagesx($pic[1]['s']);
- $pic[1]['h'] = imagesy($pic[1]['s']);
- $pic[2]['w'] = imagesx($pic[2]['s']);
- $pic[2]['h'] = imagesy($pic[2]['s']);
- $pic[3]['w'] = imagesx($pic[3]['s']);
- $pic[3]['h'] = imagesy($pic[3]['s']);
- // Laufparamteter für falsche Personen
- $j = 2;
- // Die Positionen durchlaufen
- for($i=1;$i<4;$i++) {
- // Wenn aktuelle Position nicht die ermitellte Position
- if($i != $position) {
- // x und y Koordinaten der Figur ermitteln
- $pic[$j]['x'] = randnum(($i-1)*$spacex+1,$i*$spacex-$pic[$j]['w']-1);
- $pic[$j]['y'] = randnum(1,$spacey-$pic[$j]['h']-1);
- // Figur in das Bild einfügen
- ImageCopy($im, $pic[$j]['s'], $pic[$j]['x'], $pic[$j]['y'], 0, 0, $pic[$j]['w'], $pic[$j]['h']);
- // Namen auf Position speichern
- $n[$i]['na'] = $name[$j];
- // Länge (pixel) des Names ermitteln
- $n[$i]['le'] = imagefontwidth($font)*strlen($n[$i]['na']);
- // Koordinaten des Namensrechteck ermitteln
- $n[$i]['x1'] = randnum($pic[$j]['x'], $pic[$j]['x']+$pic[$j]['w']-$n[$i]['le']);
- $n[$i]['y1'] = randnum($pic[$j]['y'], $pic[$j]['y']+$pic[$j]['h']-20);
- // Zähler hochsetzen
- $j++;
- // Wenn aktuelle Position die ermitellte Position
- }else{
- // x und y Koordinaten der Figur ermitteln
- $pic[1]['x'] = randnum(($i-1)*$spacex+1,$i*$spacex-$pic[1]['w']-1);
- $pic[1]['y'] = randnum(1,$spacey-$pic[1]['h']-1);
- // Figur in das Bild einfügen
- ImageCopy($im, $pic[1]['s'], $pic[1]['x'], $pic[1]['y'], 0, 0, $pic[1]['w'], $pic[1]['h']);
- // Namen auf Position speichern
- $n[$i]['na'] = $name[1];
- // Länge (pixel) des Names ermitteln
- $n[$i]['le'] = imagefontwidth($font)*strlen($n[$i]['na']);
- // Koordinaten des Namensrechteck ermitteln
- $n[$i]['x1'] = randnum($pic[1]['x'], $pic[1]['x']+$pic[1]['w']-$n[$i]['le']);
- $n[$i]['y1'] = randnum($pic[1]['y'], $pic[1]['y']+$pic[1]['h']-20);
- }
- }
- // Namen in das Bild einfügen
- for($i=1;$i<4;$i++) {
- // x2 & y2 errechnen
- $n[$i]['x2'] = $n[$i]['x1'] + $n[$i]['le'] + 8;
- $n[$i]['y2'] = $n[$i]['y1'] + 20;
- // Wenn x2 & y2 außerhalb des Bildes
- if($n[$i]['x2'] > $width-1) {
- $n[$i]['x1'] = $width-$n[$i]['le']-9;
- $n[$i]['x2'] = $width-1;
- }
- if($n[$i]['y2'] > 148) {
- $n[$i]['y1'] = 128;
- $n[$i]['y2'] = 148;
- }
- // Rechteck zeichnen
- imagefilledrectangle($im, $n[$i]['x1'], $n[$i]['y1'], $n[$i]['x2'], $n[$i]['y2'], $white);
- // Namen schreiben
- imagestring($im, $font, $n[$i]['x1']+4, $n[$i]['y1']+2, $n[$i]['na'], $black);
- }
- // Die linke Position der Frage errechnen
- $leftquestpos = ( $width - imagefontwidth($font)*strlen($question) )/2;
- // Die Frage schreiben
- imagestring($im, $font, $leftquestpos, $height-18, $question, $white);
- // Session String mit Namen füllen
- $_SESSION['CAPTCHA'] = $name[1];
- // BILD AUSGEBEN
- // Dem Browser die Bildart (png) mitteilen
- Header('Content-type: image/png');
- // Das png-Bild ausgeben
- imagepng($im);
- // Speicher freigeben
- imagedestroy($im);
- ?>
Vielen Dank
daLu