正如标题所说那样,本文只讨论输出内容全部为中文或者包含中文的情况。如果内容全是字母或者其他字符的话,可以参考这篇博客:生成验证码

问题

  此处要注意,标题中为什么要区别windows和linux分别实现?因为我在网上搜了很多的博客,几乎所有的博客都是一样的,全是使用的windows系统,源代码在linux上跑不通,会提示一个函数imagettftext()不存在,这个函数在windows下是可以使用的,但是在linux上面确实不行的。这是为什么呢?

  有人说是linux的gd库版本太低了,应该升级为高版本的gd库????

  且不说是不是真么gd库太老了,另外一个问题就是,使用imagettftext()函数的时候,需要传递一个参数,参数就是字体的文件的路径及名称。这个该怎么整?

  所以下面就按照上面的问题来叙述。

  

imagettftext()

  先看下面这个phpinfo()中对gd库的描述:

  再看下面一个系统中phpinfo()的输出:

  仔细注意上面两个gd库的区别,就会发现,第二个gd库相对于第一个gd库要多一些“功能”,这个功能就是关系到能不能使用imagettftext()函数。

  在一些linux上使用imagettftext()函数时,会提示函数不存在,但是,在windows上就行,其实就是这个原因。

  如果你的php上面没有这个FreeType,可以在网上找一下相关的博客。

多字节字符串操作

  多字节字符串的截断、求长度的问题,可以使用mb_扩展,否则会出现乱码。

  

字体

  中文验证码的内容是中文,所以,要使用中文的字体,可以上网下载即可。在imagettftext()指定字体文件的路径以及文件名和扩展名即可。

下面就是一个简单的中文验证码例子:

  产生的验证码内容存储在session中(在captcha.php完成),提交验证码(在index.php中完成)之后,在validate.php中将提交的验证码和session中的验证码作对比即可。

  如果要安全一点的话,可以将验证码加密后再存session。

 

captcha.php  专门创建中文验证码

<?php
class Captcha{
private $width;//验证码的宽
private $height;//验证码的高
private $num;//验证码字符的个数
private $code;//验证码的字符串
private $img;//验证码source //初始化
function __construct($width=80,$height=20,$num=4){
mb_internal_encoding("UTF-8");
$this->width=$width;
$this->height=$height;
$this->num=$num;
$this->code=$this->create_code();
} //创建画布
private function create_canvas(){
$this->img=imagecreatetruecolor($this->width,$this->height);
$background_color=imagecolorallocate($this->img,0xFF,0xFF,0xFF);
imagefill($this->img,0,0,$background_color);
$border_color=imagecolorallocate($this->img,0xAA,0xAA,0xAA);
imagerectangle($this->img,0,0,$this->width-1,$this->height-1,$border_color);
} //生成验证码的字符串
private function create_code(){
$src="这是字典XXXXX";
$code="";
for($i=0;$i<$this->num;$i++){
$index=mt_rand(0,mb_strlen($src)-1);
$code.= mb_substr($src,$index,1); //注意求多字节内容的长度时使用mb_扩展
}
return $code;
} //将生成的字符串画在画布上
private function paint_char(){
for($i=0;$i<$this->num;$i++){
$char_color=imagecolorallocate($this->img,0xFF,0,0xFF);
$font_size=24;
$x=5+($this->width/$this->num)*$i;
$y=($this->height-imagefontheight($font_size));
imagettftext($this->img,$font_size,mt_rand(2, 20),$x,$y,$char_color,"STXINGKA.TTF",mb_substr($this->code,$i,1,"UTF-8"));
//注意截取多字节的内容使用mb_扩展
}
} //添加干扰标记
private function add_disturbance(){
for($i=0;$i<20;$i++){
$color=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($this->img,rand(1,$this->width-2),rand(1,$this->height-2),$color);
}
} //输出图片
private function print_code() {
if (imagetypes() & IMG_PNG) {
header("Content-type: image/png");
imagepng($this->img);
} elseif (imagetypes() & IMG_JPG) {
header("Content-type: image/jpeg");
imagejpeg($this->img);
} else {
die("No image support in this PHP server");
}
} //获取验证码字符串的值
public function get_code(){
return $this->code;
} //释放资源
private function destroy_code(){
imagedestroy($this->img);
} //搞定所有验证码的工作
public function show_image_code(){
$this->create_canvas();
$this->paint_char();
$this->add_disturbance();
$this->print_code();
$this->destroy_code(); }
} session_start();
$captcha = new Captcha(200, 60, 4);
$captcha->show_image_code();
$_SESSION['cap_v'] = $captcha->get_code();
?>

  

index.html   首页显示

<!DOCTYPE html>
<html>
<head>
<title>中文验证码</title>
<meta charset='utf-8'>
</head> <body>
<img id="captcha_img" border='1' src='./captcha.php' style="width: 100px; height: 30px"><br>
<a href='' id="change_img">换一个?</a><br><br>
<input type='text' id='cap_v'>
<button id="btn">submit</button>
</body> <script>
var captcha_img = document.getElementById("captcha_img");
var change_img = document.getElementById("change_img");
var btn = document.getElementById("btn");
change_img = captcha_img.onclick = function(){
captcha_img.src='./captcha.php?r='+Math.random();
return false;
} btn.onclick = function(){
var xhr = new XMLHttpRequest();
var cap_v = document.getElementById("cap_v").value;
if( cap_v.trim().length == 0){
alert("验证码不能为空");
return;
}
xhr.open("post","validate.php",true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("cap_v=" + cap_v);
xhr.onreadystatechange = function(){
if(xhr.readyState==4){
if((xhr.status==200 && xhr.status<300) || xhr.status==304){
if(xhr.responseText == 'right'){
alert("欢迎");
} else {
alert("验证码输入错误");
}
}
}
}
}
</script>
</html>

  

validate.php 用于检测验证码是否正确

<?php
session_start();
if(isset($_POST['cap_v'])){
if($_SESSION['cap_v'] == trim($_POST['cap_v'])){
echo 'right';
} else {
echo 'wrong';
}
}
?>

  

运行截图:

php使用gd库输出中文内容的图片的更多相关文章

  1. gd库的相关内容

    gd库注意事项 对于乱码问题 在php里面包含 header("content-type:image/png"); 这样输出的图像就不会乱码了后面跟的Png也可以改变为自己想要输出 ...

  2. PHP利用GD库绘图和生成验证码图片

    首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...

  3. php使用gd库将文字转换成图片(转)

    GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. <?php header("Content-type: ...

  4. PHPEXCEL 不能输出中文内容,只显示空白

    以他带的示例文件为例 01simple-download-xls.php // Add some data $objPHPExcel->setActiveSheetIndex(0)        ...

  5. GD库imagettftext中文乱码的问题

    linux下出现乱码,加上编码转换就可以了. $str = mb_convert_encoding($str, "html-entities", "utf-8" ...

  6. 一起学习PHP中GD库的使用(一)

    又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎.从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们 ...

  7. php中GD库的简单使用

    在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...

  8. PHP验证码生成及图片处理(GD库)

    GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印. 本章实现了生成图片并绘画各种形状.图片的压缩.中文字符水印及图片水印 ...

  9. 一起学习PHP中GD库的使用(二)

    在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...

随机推荐

  1. Thinkphp框架中自定义修改success和error页面

    Thinkphp框架中自定义修改success和error页面 Thinkphp框架的默认success和error太难看,可以自定义设置,步骤如下: (注意:TP原框架中的success跳转有问题, ...

  2. [Hive_add_6] Hive 实现 Word Count

    0. 说明 Hive 通过 explode()函数 和 split()函数 实现 WordConut 1. Hive 实现 Word Count 方式一 1.1 思路 将每一行文本变为 Array 数 ...

  3. 排序算法之选择排序的思想以及Java实现

    1 基本思想 选择排序的思想是,每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 2,算法的实现(Java) package Algorit ...

  4. 了解 IP 地址,默认网关,子网掩码,DNS 的概念和作用。

    DNS(Domain Name System):域名解析服务器,在 Internet 上域名与 IP 地址一一对应,域名便于人记忆,但是机器只认识 IP 地址,他们之间的转换工作称为 ‘域名解析’,域 ...

  5. JavaScript -- 时光流逝(十二):DOM -- Element 对象

    JavaScript -- 知识点回顾篇(十二):DOM -- Element 对象 (1) element.accessKey: 设置或返回accesskey一个元素,使用 Alt + 指定快捷键 ...

  6. ServletContextListener的作用

    ServletContextListener是对ServeltContext的一个监听.servelt容器启动,serveltContextListener就会调用contextInitialized ...

  7. 关于this的理解

    var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //undefined console.log(this); //windo ...

  8. WPF自定义控件(三)の扩展控件

    扩展控件,顾名思义就是对已有的控件进行扩展,一般继承于已有的原生控件,不排除继承于自定义的控件,不过这样做意义不大,因为既然都自定义了,为什么不一步到位呢,有些不同的需求也可以通过此来完成,不过类似于 ...

  9. C#自动化操作IE浏览器系列之一打开新的浏览器并导航到百度进行搜索

    现在OA系统.生产管理系统都是B/S结构,很多的办公室工作都要用浏览器操作.自己会一点C# winform开发,就做个小工具自动化处理一些繁琐的操作. 我的开发环境是:win7旗舰版+VS2010(或 ...

  10. 计划任务执行bat

    @echo offtaskkill /f /t /im ControlKJmen.exetaskkill /f /t /im KJMen.exetaskkill /f /t /im DisplayLo ...