【问题标题】:Generate Captcha Image PHP生成验证码图像 PHP
【发布时间】:2014-02-13 09:11:20
【问题描述】:

我想使用 PHP imagettftext 生成验证码图像。以下是我的代码。它给出了一个空图像。我想解决这个问题。

我已经测试了代码,但无法找到为什么图像没有显示,尽管我的随机文本正在传递给验证码图像生成函数。

<?php

    function generateRandomString($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, strlen($characters) - 1)];
        }
        return $randomString;
    }

    function generateCaptchaImage($text = 'good'){
        echo $text;
        echo 'OK';
        // Set the content-type
        header('Content-Type: image/png');

        $width = 200;
        $height = 30;
        $font = 'ThisisKeSha.ttf';

        // Create the image
        $im = imagecreatetruecolor($width, $height);

        //ADD NOISE - DRAW background squares
        $square_count = 6;
        for ($i = 0; $i < 10; $i++) {
          $cx = (int)rand(0, $width/2);
          $cy = (int)rand(0, $height);
          $h  = $cy + (int)rand(0, $height/5);
          $w  = $cx + (int)rand($width/3, $width);
          imagefilledrectangle($im, $cx, $cy, $w, $h, $white);
        }

        //ADD NOISE - DRAW ELLIPSES
        $ellipse_count = 5;
        for ($i = 0; $i < $ellipse_count; $i++) {
          $cx = (int)rand(-1*($width/2), $width + ($width/2));
          $cy = (int)rand(-1*($height/2), $height + ($height/2));
          $h  = (int)rand($height/2, 2*$height);
          $w  = (int)rand($width/2, 2*$width);
          imageellipse($im, $cx, $cy, $w, $h, $grey);
        }

        // Add the text
        imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

        imagepng($im);

    }

    $randomString = generateRandomString();
    generateCaptchaImage($randomString);

    ?>

【问题讨论】:

  • 错误日志中有什么内容?
  • $white$black 未定义。删除 echo $text;echo 'OK';ThisisKeSha.ttf 是否在您的服务器上并且与此目录位于同一目录中?
  • 非常感谢缺少 $white 和 $black !!!!

标签: php image text captcha imagettftext


【解决方案1】:

试试这个代码;

<?php
    function generateRandomString($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, strlen($characters) - 1)];
        }
        return $randomString;
    }
    function generateCaptchaImage($text = 'good'){
        // Set the content-type
        header('Content-Type: image/png');
        $width  = 200;
        $height = 30;
        // Create the image
        $im = imagecreatetruecolor($width, $height);

        // Create some colors
        $white  = imagecolorallocate($im, 255, 255, 255);
        $grey   = imagecolorallocate($im, 128, 128, 128);
        $black  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 399, 29, $white);

        //ADD NOISE - DRAW background squares
        $square_count = 6;
        for($i = 0; $i < $square_count; $i++){
            $cx = rand(0,$width);
            $cy = (int)rand(0, $width/2);
            $h  = $cy + (int)rand(0, $height/5);
            $w  = $cx + (int)rand($width/3, $width);
            imagefilledrectangle($im, $cx, $cy, $w, $h, $white);
        }

        //ADD NOISE - DRAW ELLIPSES
        $ellipse_count = 5;
        for ($i = 0; $i < $ellipse_count; $i++) {
          $cx = (int)rand(-1*($width/2), $width + ($width/2));
          $cy = (int)rand(-1*($height/2), $height + ($height/2));
          $h  = (int)rand($height/2, 2*$height);
          $w  = (int)rand($width/2, 2*$width);
          imageellipse($im, $cx, $cy, $w, $h, $grey);
        }

        // Replace path by your own font path
        $font = 'ThisisKeSha.ttf';

        // Add some shadow to the text
        imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

        // Add the text
        imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

        // Using imagepng() results in clearer text compared with imagejpeg()
        imagepng($im);
        imagedestroy($im);
    }

    $randomString = generateRandomString();
    generateCaptchaImage($randomString);
?>

您没有生成颜色 $white$black$grey 。此外,字体必须在此 php 文件的同一文件夹中。

【讨论】:

    【解决方案2】:

    从 cmets 解决

    • $white$black 未定义。
    • 删除echo $text;echo 'OK';
    • ThisisKeSha.ttf 是否在您的服务器上并且与此位于同一目录中?

    $white$black 未定义。

    【讨论】:

      【解决方案3】:

      漂亮的验证码图像生成器:

      class captcha{
          public static function create(){
      
              $image = imagecreatetruecolor(160, 40);
              imagefilledrectangle($image, 0, 0, 160, 40, imagecolorallocate($image, 244, 245, 245));
      
              $code="";
              for($i=0;$i<6;$i++){
                  $color = imagecolorallocate($image, rand(160,230), rand(160,240), rand(160,250));
                  imageline($image, rand(10,140), rand(2,35), rand(10,140), rand(5,35), $color) ;
              }
              for($i=1;$i<6;$i++){
                  $color = imagecolorallocate($image, rand(50,150), rand(50,140), rand(50,150));
                  $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                  $num = $char[rand(0, strlen($char)-1)];
                  $code .= $num;
                  //use a proper font file like verdana.ttf and change the font name at bellow
                  imagefttext($image, rand(14, 18), rand(-10,40), $i*25, rand(24,34), $color, __DIR__."/verdana.ttf", $num);
              }
      
              imagejpeg($image,"cap.jpg");
      
          }
      }    
      
      captcha::create();
      
      echo "<img src=\"cap.jpg\">";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多