Captcha

dakata__92

Super Moderator
Имам класс създаващ изображение. Проблема ми е че искам този метод да връща снимката за да мога да я поставя в някакъв img таг. Искам да си направя изображението като част от библиотеката на фрейма ми подкарах си изображението с помощта на GD но ми го изкарва като геядър на цялата страница.
PHP:
public function create(){
		header('Content-type: image/png');
		
		$font_file = 'captcha.ttf';
		$x = 250;
		$y = 35;
		$z = 4;
	
		$image = imagecreate($x, $y);
		$back = imagecolorallocate($image, 255, 255, 255);
		imagecolortransparent($image, $back);
		$border = imagecolorallocate($image, 1000, 0, 0);

		//imagerectangle($image,0,0,99,29,$border);
		$n = round($x / $z);
		$code = "";
		for ($i = 0; $i < $z; $i++){
			$r = rand(0, 9);
			imageline($image, 0, rand(0, $y), $x, rand(0, $y), $border);
			imageline($image, rand(0, $x), 0, rand(0, $x), $y, $border);
			imagettftext($image, rand(12, 22), rand(-30, 30), 5 + $i * $n, rand(20, 30), $border, $font_file, $r);
			$code .= $r;
		}

		imagepng($image);
		imagedestroy($image);
	}

Как да стане примерно нещо такова:
Код:
echo '<img src="'.$c->create().'" />'
в най-груб варянт за да ме раберете.
 
Може да пробваш да я ембеднеш
PHP:
<?php
function captcha(){	
        $font_file = './freemono.ttf';
        $x = 250;
        $y = 35;
        $z = 4;
        $image = imagecreate($x, $y);
        $back = imagecolorallocate($image, 255, 255, 255);
        imagecolortransparent($image, $back);
        $border = imagecolorallocate($image, 1000, 0, 0);

        //imagerectangle($image,0,0,99,29,$border);
        $n = round($x / $z);
        $code = "";
        for ($i = 0; $i < $z; $i++){
                $r = rand(0, 9);
                imageline($image, 0, rand(0, $y), $x, rand(0, $y), $border);
                imageline($image, rand(0, $x), 0, rand(0, $x), $y, $border);
                imagettftext($image, rand(12, 22), rand(-30, 30), 5 + $i * $n, rand(20, 30), $border, $font_file, $r);
                $code .= $r;
        }
	ob_start();        
	imagepng($image);
	$imageData = ob_get_contents();
	ob_end_clean();
        imagedestroy($image);
	return "data:image/png;base64," . base64_encode($imageData);	
}
?>

HTML:
<img alt="Embedded Image" src="<?=captcha();?>"/>
 
Поне при мен този варянт не се получава. Трещи грешки за грешки в изображението. Нещо май с логиката ли бъркам незнам. Дайте идеи как да го постигна. Така пробвах и не ми изкарва грешки но пак си визуализира изображението. Дали не е заради header('Content-type: image/png'); ?

PHP:
public function create(){
		header('Content-type: image/png');
		
		$font_file = 'captcha.ttf';
		$x = 250;
		$y = 35;
		$z = 4;
	
		$image = imagecreate($x, $y);
		$back = imagecolorallocate($image, 255, 255, 255);
		imagecolortransparent($image, $back);
		$border = imagecolorallocate($image, 1000, 0, 0);

		//imagerectangle($image,0,0,99,29,$border);
		$n = round($x / $z);
		$code = "";
		for ($i = 0; $i < $z; $i++){
			$r = rand(0, 9);
			imageline($image, 0, rand(0, $y), $x, rand(0, $y), $border);
			imageline($image, rand(0, $x), 0, rand(0, $x), $y, $border);
			imagettftext($image, rand(12, 22), rand(-30, 30), 5 + $i * $n, rand(20, 30), $border, $font_file, $r);
			$code .= $r;
		}

		      
		$imageData = imagepng($image);
        imagedestroy($image);
		return "data:image/png;base64," . base64_encode($imageData);
	}
 
В самата страница изчисти всичко картинкосъздаващо и остави само
HTML:
<img src="imgcreate.php" />
След това в отделен файл imgcreate.php пъхаш кода за генерирането :?:
Предполагам разбираш какво се получава?
 
1. Махни хедъра от create() функцията (header('Content-type: image/png');
) там не ти трябва.
2. Не моге така да вземеш изображението. imagepng() връща боолеан, не изображение.
обърни внимание на този фрагмент.
Код:
ob_start();        
	imagepng($image);
	$imageData = ob_get_contents();
	ob_end_clean();
        imagedestroy($image);
Поздрави.
 

Back
Горе