破碎的图像PHP(GD)

时间:2013-08-19 11:34:23

标签: php image web gd

我的图片如下:

enter image description here

它从anticot.php获取图像

这是我的anticot.php

<?php
    session_start();
    $width      = 75;
    $height     = 40;
    $length     = 3;
    $baseList   = '1234567890';
    $code       = "";
    $counter    = 0;
    $image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');

    for($i=0; $i<10; $i++){
       imageline($image, 
             mt_rand(0,$width), mt_rand(0,$height), 
             mt_rand(0,$width), mt_rand(0,$height), 
             imagecolorallocate($image, mt_rand(150,255), 
                                        mt_rand(150,255), 
                                        mt_rand(150,255)))) or die('Kunne ikke velge line!');
    }

    for($i=0, $x=0; $i<$length; $i++){
       $actChar = substr($baseList, rand(0, strlen($baseList)-1), 1);
       $x += 10 + mt_rand(0,10);
       imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
          imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155)))) or die('Kunne ikke velge GD2!');
       $code .= strtolower($actChar)) or die('Kunne ikke velge GD3!');
    }

    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
    $_SESSION['securityCode'] = $code;
?> 

我已经安装了GD和freetype,有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

语法错误,ComFreek是对的:

   imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
      imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155)))) or die('Kunne ikke velge GD2!');
//                                                                            /\4?

有一个结束括号太多,应该是

   imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
      imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155))) or die('Kunne ikke velge GD2!');
//                                                                       3 is enough

哦,,不要使用or die。如果有错误,请修复它。不要使用无意义的or die消息。让PHP显示错误(如第X行:意外)) 另外:不要使用@错误抑制运算符。如果有错误:修复它,不要掩盖它。将你的ini设置为E_STRICT | E_ALL并将错误设置为1,然后使用您的代码,直到它没有通知为止。

$image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');
//should be:
$image = imagecreate($width, $height);

它使您的代码更具可读性,如果出现问题,至少您有更好的机会实际知道要修复的内容。像“Kunne ikke velge GD!”之类的东西就像“有些东西不起作用......不知道是什么或在哪里”

答案 1 :(得分:1)

您的代码没有太多问题。删除 for 循环内 imagecolorallocate 末尾的额外括号。它只是有一些语法错误。

<?php
    session_start();
    $width      = 75;
    $height     = 40;
    $length     = 3;
    $baseList   = '1234567890';
    $code       = "";
    $counter    = 0;
    $image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');

    for($i=0; $i<10; $i++){
       imageline($image, 
             mt_rand(0,$width), mt_rand(0,$height), 
             mt_rand(0,$width), mt_rand(0,$height), 
             imagecolorallocate($image, mt_rand(150,255), 
                                        mt_rand(150,255), 
                                        mt_rand(150,255))) or die('Kunne ikke velge line!'); 
    }

    for($i=0, $x=0; $i<$length; $i++){
       $actChar = substr($baseList, rand(0, strlen($baseList)-1), 1);
       $x += 10 + mt_rand(0,10);
       imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
          imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155))) or die('Kunne ikke velge GD2!');
       $code .= strtolower($actChar) or die('Kunne ikke velge GD3!');
    }

    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
    $_SESSION['securityCode'] = $code;
?> 

但更喜欢使用类似recaptcha的内容,这样更容易实现,您可以让用户通过使用它来为书籍数字化做出贡献。