php使用gd库输出中文内容的图片
正如标题所说那样,本文只讨论输出内容全部为中文或者包含中文的情况。如果内容全是字母或者其他字符的话,可以参考这篇博客:生成验证码
问题
此处要注意,标题中为什么要区别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库输出中文内容的图片的更多相关文章
- gd库的相关内容
gd库注意事项 对于乱码问题 在php里面包含 header("content-type:image/png"); 这样输出的图像就不会乱码了后面跟的Png也可以改变为自己想要输出 ...
- PHP利用GD库绘图和生成验证码图片
首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...
- php使用gd库将文字转换成图片(转)
GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. <?php header("Content-type: ...
- PHPEXCEL 不能输出中文内容,只显示空白
以他带的示例文件为例 01simple-download-xls.php // Add some data $objPHPExcel->setActiveSheetIndex(0) ...
- GD库imagettftext中文乱码的问题
linux下出现乱码,加上编码转换就可以了. $str = mb_convert_encoding($str, "html-entities", "utf-8" ...
- 一起学习PHP中GD库的使用(一)
又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎.从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们 ...
- php中GD库的简单使用
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
- PHP验证码生成及图片处理(GD库)
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印. 本章实现了生成图片并绘画各种形状.图片的压缩.中文字符水印及图片水印 ...
- 一起学习PHP中GD库的使用(二)
在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...
随机推荐
- 简述openstack
大家好,我顾某人又回来了,开学第一更.... 以下内容均为个人理解和整理,有不对的地方还望dalao指正..... 本文所用图片均已标明来源. openstack是什么? OpenStack是一个开源 ...
- 如何写 go 代码 (How to Write Go Code 翻译)
目录 1. 写在前面的话 2. 介绍 3. 代码组织 3.1. 工作区 3.2. GOPATH 环境变量 3.3. Package 路径 3.4. 第一个 GO 程序 3.5. 第一个 GO 库 3. ...
- SpringCloud之初识Feign ----- 分布式负载自动拼接请求的URL
在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码: String baseUrl = "http://user-service/user/"; Us ...
- 【Linux基础】crontab定时命令详解
周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“crontab”,是 ...
- margin-left:-20px
对于负的margin值,设置其作用时要和position:absolute;一起使用
- Navicat 链接mysql 显示 Clinet dose not support authentication protocol request by server ;consider upgrading MySQL client
1 在命令窗口 输入mysql -uroot -p 首先通过cmd进入mysql 2 更改加密方式 mysql> ALTER USER 'root'@'localhost' IDENTIFIE ...
- 查看linux内存使用情况
查看内存使用情况 free -m total used free shared buffers cached Mem: -/+ buffers/cache: Swap: used=total-free ...
- sqlachemy 查询当日数据,
Tokens.query.filter(Tokens.user_id == user_id, db.cast(Tokens.create_time, db.DATE) == db.cast(curre ...
- CMake 常用方法
CMake 允许开发者编写平台无关的 CMakeLists.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Linux 的Makefi ...
- Python 的全局变量
结论: Python 的全局变量只在本文件中生效. 定义全局变量的文件 G.py # define some global variable A = 1 B = 2 C = 3 def fuck(a= ...