简单的验证码php脚本不在图像上显示文本

时间:2014-11-20 14:31:15

标签: php captcha

我希望能够找到一个我无法在任何地方找到解决方案的人。

我正在尝试使用php在我的网站上创建验证码,虽然我能够创建一个图像并创建随机验证码文本。

我无法超越两者。这是我的代码:

<?PHP

session_start();


function generateRandomString($length = 10) {
    $letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $len = strlen($letters);
    $letter = $letters[rand(0, $len - 1)];
    $text_color = imagecolorallocate($image, 0, 0, 0);
    $word = "";
    for ($i = 0; $i < 6; $i++) {
        $letter = $letters[rand(0, $len - 1)];
        imagestring($image, 7, 5 + ($i * 30), 20, $letter, $text_color);
        $word .= $letter;
    }
    $_SESSION['captcha_string'] = $word;

}


function security_image(){

   // $code = isset($_SESSION['captcha']) ? $_SESSION['captcha'] : generate_code();
    //$font = 'content/fonts/comic.ttf';

    $width = '110';
    $height = '20';
    $font_size = $height * 0.75;
   // $image = @imagecreate($width, $height) or die('GD not installed');
               global $image;
    $image = imagecreatetruecolor($width, $height) or die("Cannot Initialize new GD image stream");

               $background_color = imagecolorallocate($image, 255, 255, 255);  
               imagefilledrectangle($image,0,0,200,50,$background_color);


               $line_color = imagecolorallocate($image, 64,64,64); 
               for($i=0;$i<10;$i++) {
    imageline($image,0,rand()%50,200,rand()%50,$line_color);
               }

               $pixel_color = imagecolorallocate($image, 0,0,255);
               for($i=0;$i<1000;$i++) {
                              imagesetpixel($image,rand()%200,rand()%50,$pixel_color);
               }

               //$textbox = imagettfbbox($font_size, 0, $font, $code);
               //$textbox = imagettfbbox($font_size, 0, $randomString);

    $x = ($width - $textbox[4]) / 2;
    $y = ($height - $textbox[5]) / 2;
   // imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
   imagettftext($image, $font_size, 0, $x, $y, $text_color , $word);


    $images = glob("*.png");
    foreach ($images as $image_to_delete) {
        @unlink($image_to_delete);
    }
    imagepng($image, "image" . $_SESSION['count'] . ".png");

    header('Content-Type: image/png');
    imagepng($image);
    imagedestroy($image);

}

security_image();




?>

我不知道我做错了什么。我在这个“显示文本”问题上花了10多个小时。我不明白,我迫切需要帮助。我甚至从其他资源下载了工作验证码版本,一旦我将其上传到我的服务器就会中断。我不知道是怎么回事。起初我以为我的服务器出了问题,但事实上我甚至可以创建像素,线条图像意味着它至少有效。

请帮忙!!!! 

UPDATE --------------------------------------------- 谢谢你的建议。这是编辑过的代码。我仍然遇到同样的问题。

<?PHP

session_start();


function security_image(){
    global $image;

   // $code = isset($_SESSION['captcha']) ? $_SESSION['captcha'] : generate_code();

    $font = 'content/fonts/comic.ttf';

    $width = '110';
    $height = '20';
    $font_size = $height * 0.75;

    $image = imagecreatetruecolor($width, $height) or die("Cannot Initialize new GD image stream");

    $background_color = imagecolorallocate($image, 255, 255, 255);  
    imagefilledrectangle($image,0,0,200,50,$background_color);


    $line_color = imagecolorallocate($image, 64,64,64); 
    for($i=0;$i<10;$i++) {
    imageline($image,0,rand()%50,200,rand()%50,$line_color);
    }

    $pixel_color = imagecolorallocate($image, 0,0,255);
    for($i=0;$i<1000;$i++) {
        imagesetpixel($image,rand()%200,rand()%50,$pixel_color);
    }

    $letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $len = strlen($letters);
    $letter = $letters[rand(0, $len - 1)];
    $text_color = imagecolorallocate($image, 0, 0, 0);
    $word = "";
    for ($i = 0; $i < 6; $i++) {
        $letter = $letters[rand(0, $len - 1)];
        imagestring($image, 7, 5 + ($i * 30), 20, $letter, $text_color);
        $word .= $letter;
    }
    $_SESSION['captcha_string'] = $word;

    /*texbox unitinitialized (removed for the sake of just showing the word size doesnt matter)
        $x = ($width - $textbox[4]) / 2;
        $y = ($height - $textbox[5]) / 2;
    */

    $x = ($width) / 2;
    $y = ($height) / 2;
    imagettftext($image,$font, 4, $x, $y, $word);



    header('Content-Type: image/png');
    imagepng($image);
    imagedestroy($image);

}
security_image();?>

我做了一些建议的更改,但代码似乎仍然做同样的事情。只是按预期显示线条和像素,但文本仍然缺失......?

2 个答案:

答案 0 :(得分:1)

有几个&#34;错误&#34;在你的功能中,让我们解决它们:

generateRandomString()

  • generateRandomString($length = 10)

$lenght未使用其范围。

  • $text_color = imagecolorallocate($image, 0, 0, 0);

$image未初始化


security_image()功能中:

  • $textbox未初始化

  • $text_color$word未初始化。

  • Wrong parameter count for imagettftext()您添加了7个参数,忘记了font file参数。

答案 1 :(得分:0)

发现了这个问题。使用这个: http://php.net/manual/en/function.imagettftext.php

我能看到字体位置不正确。使用该页面上的示例并根据我的需要进行编辑。