我使用Imagemagick制作了一个自定义验证码,它停止了工作

时间:2012-10-07 23:54:56

标签: php imagemagick captcha

我不确定问题是什么,在我将文件移动到新目录之前它工作正常现在它似乎不想加载/创建图像。

<?php
session_start();
header('Content-type: image/png');

$text = $_SESSION['secure'];
$image = new Imagick();
$draw = new ImagickDraw();
$color = new ImagickPixel('#444444');

$image->newImage(320, 40, new ImagickPixel('#0d0d0d'));
$image->setImageFormat('png');
$draw->setFont("fonts/UbuntuMono-B.ttf");
$draw->setFontSize(30);
$draw->setFillColor($color);
$image->annotateImage($draw, 100, 30, 0, $text);

$image->sketchImage (1, 10, 0);

echo $image;

?>

3 个答案:

答案 0 :(得分:1)

不完全确定Imagick的工作原理,但您确定在移动目录的目录中拥有相应的文件权限吗?

你确定你没有改变什么吗?

最后,如果你把它放回去,它仍能正常工作吗?

(我会回复你的问题,但我没有必要的声誉)

答案 1 :(得分:0)

您可以在文件顶部添加以下内容来检查错误:

ini_set('display_errors',1); 
error_reporting(E_ALL);

或从命令行:

php -l filepath.php

将文件夹的所有者设置为apache(如果您使用的是apache)可以解决您的问题,如果它是权限。

chown apache:apache filepath.php

Google has a thorough tutorial on the subject.

答案 2 :(得分:0)

我们需要生成一个随机字符串(文本),将其存储在会话中以检查$ _POST,使用该字符串创建图像,在表单上显示图像,然后在提交时进行检查。

步骤1.创建一个随机字符串并将其保存在$ _SESSION中 这一步非常容易,因为PHP具有我们所需的所有功能。生成随机字符串的一种快速有效的方法是使用rand函数,将其md5加密,然后仅提取所需数量的字符。

代码:

getResponseForItem(item)

将以上内容保存到“ captcha.php”,然后查看其生成的内容。 资源:http://www.php.net/md5http://www.php.net/randhttp://www.php.net/substrhttp://www.php.net/uniqid

步骤2。根据生成的字符串创建图像 有很多不同的方法可以做到这一点,例如使用GD库(gd库),但是我更喜欢使用ImageMagick进行图像处理-个人选择。

请注意:ImageMagick和GD Lib默认情况下不随PHP一起提供,请检查它们是否已安装在您的服务器上。

首先,我们需要背景图像(附加到此线程-请将其存储在images /文件夹中)-每次生成图像时,都会随机选择“ bg1.png”,“ bg2.png”和“ bg3.png”背景图片。我们将文件名存储在易于访问的数组中。使用ImageMagick时,您应该上传所需的字体以使用,这意味着它将在其他服务器上始终能够使用您的字体。

所以我们现在有以下代码。 代码:

<?php
session_start(); // Very important.
$captcha = md5(uniqid(rand(), true)); // Generate our random string.
$captcha = substr($captcha,0,6);
$_SESSION['captchaCode'] = $captcha; // Save the captch code to a session.
echo $captcha; // echo a generated code for testing purposes
?>

现在是最复杂的部分,实际上是将它们放在一起-但请放心,我会尽一切可能评论所有事情。

代码:

<?php
session_start(); // Very important.
$captcha = md5(uniqid(rand(), true)); // Generate our random string.
$captcha = substr($captcha,0,6);
$_SESSION['captchaCode'] = $captcha; // Save the captch code to a session.
//echo $captcha; // echo a generated code for testing purposes

$imageDirectory = 'images/';  // The relative or absolute path to where images are stored.

$bgImages = array('bg1.png', 'bg2.png', 'bg3.png');

$backgroundImage = $imageDirectory.$bgImages[rand(0, count($bgImages)-1)]; // This chooses an image.

?>

运行上面的代码时,您应该看到类似以下内容: 图片

第3步。在表单中使用验证码。 好了,困难的部分已经过去了!从这里开始变得更加简单!

我们所需要做的就是将验证码脚本加载到img标签中,例如

这是表单页面。 代码:

<?php
session_start(); // Very important.
$captcha = md5(uniqid(rand(), true)); // Generate our random string.
$captcha = substr($captcha,0,6);
$_SESSION['captchaCode'] = $captcha; // Save the captch code to a session.
//echo $captcha; // echo a generated code for testing purposes

$imageDirectory = 'images/';  // The relative or absolute path to where images are stored.

$bgImages = array('bg1.png', 'bg2.png', 'bg3.png');

$backgroundImage = $imageDirectory.$bgImages[rand(0, count($bgImages)-1)]; // This chooses an image.

$tmpFilename = $captcha . '.png'; // Use the captcha code to create a random filename - Please note this filename is not shown in the user's web browser.
$imageTmpDirectory = 'images/tmp/'; //Directory to store all tmp generated images.

$font = 'arial.ttf'; // The chosen font - this font sits in the same folder as this script.
$FontSize = rand(24, 36); // Random select a font size between 24 and 36.
$hexValues = array('0','1','2','3','4'); // Hex values, we always want dark colours hence 0 to 5.
$numHex = count($hexValues); // Count how many hex values.
$GeneratedHex = ''; // Set the variable.

for ($i = 0; $i < 6; $i++) {
$GeneratedHex .= $hexValues[rand(0, $numHex-1)]; // Generate the end hex colour.
}

$gravities = array('West', 'Center', 'East'); // ImageMagicks gravity function.
$gravity = $gravities[rand(0, count($gravities)-1)]; // Choose a gravity.

$angle = rand(-5, 5); // Generate an angle for the text.

$cmd  = '/usr/bin/convert'; // Path to ImageMagick on the server.
$cmd .= ' -font '.$font; // The generated colour.
$cmd .= ' -fill "#'.$GeneratedHex.'"'; // The generated colour.
$cmd .= ' -pointsize '.$FontSize ; // The size.
$cmd .= ' -gravity "'.$gravity.'"'; // Select generated gravity.
$cmd .= ' -draw \'text 0,0 "'.$captcha.'"\''; // Draw the captcha.
$cmd .= ' -rotate '.$angle; // Rotate the text to the generated angle.
$cmd .= ' ./'.$backgroundImage.' ./'.$imageTmpDirectory.$tmpFilename; // Assign background image and then save output.

exec($cmd); // Run the command!

header('Content-Type: image/png');
print fread(fopen($imageTmpDirectory.$tmpFilename, 'r'), filesize($imageTmpDirectory.$tmpFilename));

unlink($imageTmpDirectory.$tmpFilename); // Delete the tmp image.

?>

这是提交页面(capturePost.php) 代码:

<?php
session_start(); // Very important to be the first statement. ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form action="capturePost.php" method="post">
<?php
if(!empty($_SESSION['ERROR'])) { // We have an error from capturePost.php
   echo '<p>' . $_SESSION['ERROR'] . '</p>'; // Display error.
   unset($_SESSION['ERROR']); // Clear error.
}?>

<img src="captcha.php" alt="Captcha Code"><br />

Please enter the security code <input type="text" name="captcha">
<br /><input type="submit">
</form>
</body>
</html>

我真的希望这会有所帮助。