我有一个非常可靠的PHP表单(在防止垃圾邮件方面),我已经使用多年了但是我想更改验证码使用的字体,因为很多时候人们无法区分数字'0'和大写字母'O'然后他们认为我的形式“不起作用”,我得到了投诉。我不确定它目前使用的是什么字体 - 请参阅here。
但是我想把它改成一种比“Times New Roman”,Times或serif更具可读性的字体。
这是我生成验证码图像的PHP代码:
<?php if (!isset($_SESSION)) session_start(); header("(anti-
spam-content-type:) image/png");
$enc_num = rand(0, 9999);
$key_num = rand(0, 24);
$hash_string = substr(md5($enc_num), $key_num, 5); // Length of
String
$hash_md5 = md5($hash_string);
$_SESSION['verify'] = $hash_md5;
// Fallback
setcookie("verify", $hash_md5, time()+3600, "/");
session_write_close();
// Verification Image Background Selection
$bgs = array("img/1.png","img/2.png","img/3.png");
$background = array_rand($bgs, 1);
// Verification Image Variables
$img_handle = imagecreatefrompng($bgs[$background]);
$text_colour = imagecolorallocate($img_handle, 108, 127, 6);
$font_size = 5;
$size_array = getimagesize($bgs[$background]);
$img_w = $size_array[0];
$img_h = $size_array[1];
$horiz = round(($img_w/2)-
((strlen($hash_string)*imagefontwidth(5))/2), 1);
$vert = round(($img_h/2)-(imagefontheight($font_size)/2));
// Make the Verification Image
imagestring($img_handle, $font_size, $horiz, $vert, $hash_string,
$text_colour);
imagepng($img_handle);
// Destroy the Image to keep Server Space
imagedestroy($img_handle);
?>
前几天我确实对此进行了一些研究,但又找不到那些帖子了。
我确实尝试在imagestring中添加 $ font ,如下所示:
imagestring($img_handle, $font, $font_size, $horiz, $vert,
$hash_string,
然后变量:
$ font ='serif';
但验证码不会生成。
我做错了什么?我只是希望字体采用serif格式。 有没有一种简单的方法来声明这个验证码的字体类型(serif),而无需托管字体文件或将其指向用户PC的字体位置(例如:C:\ Windows \ Fonts \ serif.ttf ...原因不是后者是因为如果有人使用他们的Android智能手机会发生什么,那么位置C:\ Windows \ Fonts \ serif.ttf将不起作用。)
答案 0 :(得分:1)
imagestring()
功能无法使用TTF字体。
如果要使用该Serif TTF字体,则需要切换并使用imagettftext()
函数,该函数要求使用FreeType支持构建PHP安装。
你也意识到因为你使用md5来构建你的验证码,它将无法在其中包含O(oh)字符,因为md5将返回一个由[0-9a-f]
组成的字符串?当它实际上不能包含O时,它们可能会误认为是零。
你应该从一个字符集构建字母,排除无法区分的字符(1,l,I,0,O等)。
$charset = 'abcdefghkmnpqrstuvwxyz23456789';