8.3.6.1 图像处理函数概述
PHP提供了一系列函数来实现在网站编程中对图像进行编辑。虽然使用这些函数能够实现的功能十分有限,无法和功能强大的专业图形图像软件相比,但是在很多需要动态生成图像、自动批量处理图像等方面,能给PHP网站开发者带来巨大帮助。其中最为典型的应用有随机图形验证码、图片水印、数据统计中饼状图、柱状图的生成等。表8-7中给列出了PHP常用的图像处理函数。
表8-7 PHP常用图像处理函数
PHP 5提供的图像处理函数总数超过了100个,表8-7中仅列出了部分常用函数。
PHP的图像处理函数都封装在一个函数库中,这就是GD库。要使用GD库中的函数来进行图像处理,必须保证安装了GD库。在PHP官方的标准发行版本中,都包含了这个库。如本书介绍的PHP 5版本,这个GD库存放在PHP安装目录下的ext子目录下,名为php_gd2.dll。读者如果担心自己的PHP版本是否包含这个函数库,可以打开PHP安装目录查找一下。
并不是php_gd2.dll库文件存在,就可以使用这些函数了。在默认的php.ini设置中,这个库并不自动载入。所以,需要首先打开这个库的自动载入功能,这样这个库中的函数就像PHP标准函数一样可以直接在程序中使用了。打开的方法很简单,用记事本打开php.ini配置文件,利用查找功能找到“;extension=php_gd2.dll”这一行,将最前面的分号去掉,然后保存,重新启动IIS(Apache),这时候GD库已经被自动加载了。如图8-20所示。
图8-20 开启GD图像函数库
若要确定此函数库是否已经被成功加载,可以打开第2章中讲过的PHP环境信息显示程序,也就是phpinfo()程序,查看列出的信息中是否有GD一项。该项目中详细列出了当前PHP的GD库信息,如图8-21所示。
图8-21 GD库信息
由于本部分函数个数较多,而且具体使用方法较为复杂,要在很有限的篇幅内进行一个较全面的介绍是十分困难的,这里仅给出两个例子,让读者先体会一下PHP图像处理函数的简单使用。对表中列出的其他函数以及未在表中列出的函数,感兴趣的读者可以参考PHP手册进行深入学习。
8.3.6.2 PHP基本绘图
通过下面一个例子来学习有关用PHP进行基本绘图的方法。
1: <?php
2: //程序8-22.php:图像处理函数使用举例
3: header("Content-type: image/png");
4: $im = @imagecreate(200, 100) or die("无法创建图像流");
5: @imagecolorallocate($im, 240, 150, 255);
6: $t_color1 = imagecolorallocate($im, 0, 0, 0);
7: $t_color2 = imagecolorallocate($im,100,100,100);
8: imagestring($im, 5, 8, 10, "I like PHP5!", $t_color1);
9: imagestringup($im,5,8,90,"Hello!",$t_color2);
10: imageellipse($im,65,65,55,55,$t_color1);
11: imageellipse($im,65,65,55,55,$t_color1);
12: imagefilledrectangle($im,110,95,160,30,$t_color2);
13: imagepng($im);
14: imagedestroy($im);
15: ?>
程序8-22.php创建了一幅PNG图像,并且在图像上面进行绘图操作。程序运行结果如图8-22所示。
图8-22 程序8-22.php的运行结果
程序8-22.php第3行指定了图像的类型,即png图像,这样8-22.php虽然是一个PHP程序,但是其作用是动态生成一张图像,因此几乎等同于一张图像。在本程序中普通的输出语句如echo等都是无效的,这一点读者应当注意。
第4行用imagecreate()函数创建一幅新图像,两个参数为图像的宽度和高度,单位是像素。此函数返回此图像的数据流,存放于$im变量中。
第5行用imagecolorallocate()函数设置了图像的背景颜色。4个参数分别为图像流、R色值、G色值、B色值。3个色值合并即产生了RGB色值。这里的240,150,255运行之后显示淡紫色。另外(0,0,0)为黑色,(255,255,255)为白色,(255,0,0)为红色等。关于RGB颜色的有关详细信息请读者自行查阅有关资料。
第6~7行分别生成了2种颜色,存在的不同的变量中以备后面使用。第一种为黑色,第二种为浅灰色。
第8行用imagestring()函数在图像上“写入”了一个字符串。6个参数分别表示图像流、所用字体、写入点的x坐标、写入点的y坐标、要写入的字符串、字符串颜色。这里面有两点值得注意:第一点是函数的第二个参数取值范围为1~5,分别代表了不同大小和是否加粗的5种字体,读者可以试着修改此参数来观察程序运行效果。第二点是这里的x,y坐标都是相对于图像的左上角,最左上角坐标为(0,0),向右为x轴,向下为y轴。单位都是像素。
第9行用imagestringup()函数向图像中竖向写入一个字符串。函数的参数含义与imagestring()函数相同。
第10行用imageellipse()函数在图像中绘制了一个圆。函数第一个参数为图像流,最后一个为绘图所用颜色,第2、3、4、5个参数分表表示圆心的x坐标、圆心的y坐标、圆的x方向半径长度、圆的y方向半径长度。在本例中,绘制了一个圆心在(65,65)这个点,半径为55的正圆。如果要绘制一个椭圆,只需要确定圆心位置,然后分别设置x方向半径和y轴方向半径即可。当这两个半径相等时是一个圆,不相等时是一个椭圆。
第11行用imagefilledrectangle()函数绘制了一个矩形,并对矩形进行颜色填充。第一个参数为图像流,最后一个参数为填充颜色。第2、3、4、5个参数的含义分别为矩形左上角x坐标、矩形左上角y坐标、矩形右下角x坐标、矩形右下角y坐标。也就是说只要提供矩形的左上角和右下角坐标,即可绘制此矩形。
第12行用imagepng()函数将此图像流输出为一张png格式的图片。也就是在浏览器中看到的图片。
第13行销毁了这个图像流。
在本例中除了png格式,还可以把图像输出为jpg、gif等常用的格式,只需要更改一下程序中第3行所指定的图像类型即可。
8.3.6.3 网站图形验证码制作
图像验证码程序是当前Web开发中常用的程序。本章学习了PHP的图像处理函数,结合前面章节学习的session函数以及表单数据提交技术,可以写出一个完整的图像验证码程序。
验证码在网站中的作用一般是防止恶意“灌水”,也就是恶意发布垃圾信息。如果没有验证码,攻击者可以利用辅助软件实现自动提交、自动注册等。由于软件执行的效率高、速度快且可以连续工作,因此常用来被攻击某个网站,制造大量垃圾数据,严重影响网站正常运行。
采用了验证码的方式之后,由于验证码每次都不一样,只有验证码输入正确才能提交信息,这样辅助软件就无法随意向服务器提交信息了。因此,验证码的设计也有一些原则,如验证码的生成是随机的,无规律可循。另外,有的辅助软件有文字识别功能,能够从图片中辨析出文字,因此验证码中的数字可以采用随机的颜色,而且七扭八歪不易辨认。总之,最理想的验证码应该是人的肉眼可以很容易地辨认出来,但是用软件识别就极为困难。
鉴于此,在设计这个验证码程序时,就不是简单的创建一幅图片,然后随机生成几个数字写上去,而是再加入一些干扰。用PHP提供的图像处理函数,可以在图像上加入一些密密麻麻的像素点,然后随机绘制两条虚线,再将几个数字的位置打乱。这样,机器识别就变得十分困难了。
本实例用到以下3个文件。
8-23-showimg.php:生成验证码,将验证码写入图片,并输出图片。
8-23-login.html:调用showimg.php,将用户输入的验证码提交到check.php进行验证。
8-23-check.php:用来验证用户输入的验证码是否正确。
下面就来看一下具体的代码。
1: <?php
2: //文件8-23-shoimg.php:生成验证码图片,并输出
3: //随机生成一个4位数的数字验证码
4: $num="";
5: for($i=0;$i<4;$i ){
6: $num .= rand(0,9);
7: }
8: //4位验证码也可以用rand(1000,9999)直接生成
9: //将生成的验证码写入Session,备验证页面使用
10: session_start();
11: $_SESSION["Checknum"] = $num;
12: //创建图片,定义颜色值
13: header("Content-type: image/PNG");
14: srand((double)microtime()*1000000);
15: $im = imagecreate(60,20);
16: $black = ImageColorAllocate($im, 0,0,0);
17: $gray = ImageColorAllocate($im, 200,200,200);
18: imagefill($im,0,0,$gray);
19: //随机绘制两条虚线,起干扰作用
20: $style = array($black, $black, $black, $black, $black, $gray, $gray,
$gray, $gray, $gra y);
21: imagesetstyle($im, $style);
22: $y1=rand(0,20);
23: $y2=rand(0,20);
24: $y3=rand(0,20);
25: $y4=rand(0,20);
26: imageline($im, 0, $y1, 60, $y3, IMG_COLOR_STYLED);
27: imageline($im, 0, $y2, 60, $y4, IMG_COLOR_STYLED);
28: //在画布上随机生成大量黑点,起干扰作用;
29: for($i=0;$i<80;$i ){
30: imagesetpixel($im, rand(0,60), rand(0,20), $black);
31: }
32: //将四个数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成
33: $strx=rand(3,8);
34: for($i=0;$i<4;$i ){
35: $strpos=rand(1,6);
36: imagestring($im,5,$strx,$strpos, substr($num,$i,1), $black);
37: $strx =rand(8,12);
38: }
39: ImagePNG($im);
40: ImageDestroy($im);
41: ?>
程序中的重要位置都已经做了注释,再此不再详细讲解。本程序运行后可以在浏览器中生成一张带有验证码的图片。每次刷新程序都会生成一个新验证码。
1: <!--文件8-23-login.html:图形验证码程序-->
2: <HTML>
3: <HEAD>
4: <TITLE>图形验证码程序</TITLE>
5: </HEAD>
6: <BODY>
7: <form action="8-23-check.php" method="post">
8: <img src="8-23-showimg.php"><br>
9: 请输入验证码:<input type="text" name="passcode">
10: <input type=submit value="确定">
11: </form>
12: </BODY>
13: </HTML>
本程序是一段纯HTML代码,无需多做解释。惟一值得注意的是,在调用这个图片时,采用“<img src=“8-23-showimg.php”>”的方式。因为验证码图片本身是一张图片,所以使用<img>标签来引用。而这张图片又是用PHP程序生成的,因此直接用“src= 8-23-showimg.php”来调用。运行结果如图8-23所示。
图8-23 程序8-23-login.html的运行结果
1: <?php
2: //验证用户输入的验证码是否正确
3: session_start();
4: $passcode=$_SESSION["Checknum"];
5: $usercode=$_POST["passcode"];
6: if($passcode == $usercode){
7: echo "验证码正确!验证通过!";
8: }else{
9: echo "验证码输入错误!验证失败!";
10: }
11: ?>
程序第3行是将session中存储的正确的验证码读取出来。第4行将用户输入的验证码接收过来。然后进行比较,如果相等,则说明用户输入的验证码正确,否则不正确。
8.3.6.4 图片水印制作
不仅可以直接创建一个图像流来绘制图形,还可以将一张已有的图片作为图像流读入,然后在此基础上对图像进行处理。这一功能常用来制作图像水印。所谓图像水印,就是在图像上标上一些特殊的图形或符号,用来作为图像所有者的标志或者防止图片被盗用。下面我们就看一个这样的例子。
本例使用了一张原始图片pic.jpg,现在用PHP将此图片进行处理,在图片表面按一定规律加上文字标签,产生水印效果,使之不能被直接盗用。
1: <?php
2: //文件8-24.php:为图片加水印
3: header("Content-type: image/jpeg");
4: $im = imagecreatefromjpeg("pic.jpg");
5: $white = imagecolorallocate($im,255,255,255);
6: $width=imagesx($im);
7: $height=imagesy($im);
8: $x=0;
9: $y=0;
10: while($x<$width && $y<$height){
11: imagestring($im,2, $x,$y,"https://www.xxx.com", $white);
12: $x =20;
13: $y =20;
14: }
15: imagejpeg($im);
16: imagedestroy($im);
17: ?>
本程序第3行设定本页面输出类型为jpeg图像。
第4行用imagecreateformjpeg()函数打开了一张图片pic.jpg,并返回此图片的数据流。
第5行定义了一个颜色(白色)。
第6~7行用imagesx()和imagesy()函数取得图片pic.jpg的原始尺寸。
第8~9行定义了用于控制文字添加位置的两个变量。
第10~14行用循环向图片中添加多行文字,用$x和$y两个变量控制位置和循环次数。
第15行输出此图片,第16行销毁数据流。
程序运行前和运行后的图像分别如图8-24和图8-25所示。
图8-24 原始图片
图8-25 程序8-24.php的运行结果
可以看到,处理的后的图片上加入了文字标记,这就基本达到了处理意图。但是同时也可以看出,处理后的图片由于文字的加入影响了图像的观赏性。因此水印如何加,加在什么位置,即能起到水印的作用,又不严重影响美观,才是在处理中最应考虑的。
PHP的图像处理函数就介绍这些,希望读者对此有一个基本的了解,为以后深入学习打下基础。
php提供了丰富的图像处理函数,主要包括如下几种: ①获取图像信息的函数 ②创建与销毁图像的函数 ③载入图像的函数 ④输出图像的函数 ⑤分配/取消图像颜色的函数 ⑥拷贝图像的函数 ⑦合并图像的函数 ⑧绘制线段与圆弧的函数 ⑨图像填充函数
PHP提供了一系列函数来实现在网站编程中对图像进行编辑,其中最为典型的应用有随机图形验证码、图片水印、数据统计中饼状图、柱状图的生成等。
php提供了丰富的图像处理函数