![PHP从入门到精通(微视频精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/433/34752433/b_34752433.jpg)
第12章 图形图像处理技术
(视频讲解:1小时9分钟)
由于有GD库的强大支持,PHP的图像处理功能可以说是它的一个强项,便捷易用、功能强大。另外,PHP图形化类库——JpGraph也是一款非常强大、好用的图形处理工具,可以绘制各种统计图和曲线图,也可以自定义设置颜色和字体等元素。
图像处理技术中的经典应用是绘制柱形图、折线图和饼形图,这是对数据进行图形化分析的最佳方法。本章将分别对GD2函数库及JpGraph类库进行详细讲解。
学习摘要:
GD库概述
使用GD库创建图像
使用GD库在图片上添加文字
使用GD库生成验证码
JpGraph下载和配置
使用JpGraph绘制柱形图
使用JpGraph绘制折线图
使用JpGraph绘制3D饼形图
12.1 在PHP中加载GD库
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P234_1.jpg?sign=1739275790-tvNqzv4tX7Fe2FF86iTVm1pSLhMBWvY6-0-ce7934d88b3d85d5b5f24c7c8db43bf0)
视频讲解
GD库在PHP 5中是默认安装的,但要激活GD库,必须修改php.ini文件。将该文件中的;extension=php_gd2.dll选项前的分号“;”删除(phpStudy已经默认开启),保存修改后的文件并重新启动Apache服务器即可生效。
在成功加载GD2函数库后,可以通过phpinfo()函数来获取GD2函数库的安装信息,验证GD库是否安装成功。在浏览器的地址栏中输入localhost/phpinfo.php并按Enter键,在打开的页面中检索到如图12.1所示的GD库的安装信息,即说明GD库安装成功。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P234_2.jpg?sign=1739275790-ZWpyFgCwhAI0b4rJaMGZWZBe78Tp2DQb-0-1cb1cded1c1aabf31ecce48eebfff585)
图12.1 GD2函数库的安装信息
12.2 GD库的应用
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P234_3.jpg?sign=1739275790-6IVdP2xMOjITZemz1brXRrCyTm310s94-0-09b55981a2deb8ed9e82aa7f47031297)
视频讲解
12.2.1 创建一个简单的图像
使用GD2函数库可以实现各种图形图像的处理。创建画布是使用GD2函数库来创建图像的第一步,无论创建什么样的图像,首先都需要创建一个画布,其他操作都将在这个画布上完成。在GD2函数库中创建画布,可以通过imagecreate()函数实现。
例如,使用imagecreate()函数创建一个宽200像素、高60像素的画布,并且设置画布背景颜色RGB值为(225,66, 159),最后输出一个PNG格式的图像。代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P235_1.jpg?sign=1739275790-iXnVJLFXahrEKXTVycd2klMsX9eRA6Hk-0-bdb61c66a83a816bae6c5f96f0ef195f)
运行效果如图12.2所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P235_2.jpg?sign=1739275790-cWdUPSYZxkx8hBC9qK2vc5HAIXxeAhxc-0-e53241b86c8a49781e2c4a32616bec32)
图12.2 生成画布
12.2.2 使用GD2函数在照片上添加文字
GD2库中imageTTFText()函数可以实现用TrueType字体向图像写入文本的功能,语法格式如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P235_3.jpg?sign=1739275790-7r7biyVZ2DsMYCFUpRFv32ytr9bam0PJ-0-f12fcb9be8e82a3ffe6f15bb4494a9ea)
imageTTFText()函数的参数说明如表12.1所示。
表12.1 imageTTFText ()函数的参数说明
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-T235_4.jpg?sign=1739275790-B2omuIjuhiXv5XUPffofjVgpigqxIOUq-0-7461084516c95ddce3a04aa979e9a071)
【例12.01】 在明日学院幻灯片背景图上添加文字。(实例位置:资源包\源码\12\12.01)
使用GD2函数在照片上添加文字的具体步骤如下。
(1)使用imagecreatefromjpeg()函数载入图片。
(2)使用imagecolorallocate()函数设置字体颜色。
(3)使用imageTTFText()函数向图片中写入文本。
(4)使用imagejpeg()函数创建JPEG图像。
(5)使用imagedestroy()函数销毁图像,释放内存空间。
使用imageTTFText()函数将文字“明日学院”输出到图像中。代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P236_1.jpg?sign=1739275790-iHdb0jhSUNrxrwXRbUs60vfSotMigj9s-0-72c3cdc4be211802e111a4c3570ca6c2)
运行前、后的效果分别如图12.3和图12.4所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P236_2.jpg?sign=1739275790-oYwQnPfQXEZSeCTcdAwoC3jLg2PB03wE-0-cdcef73bb7124b88e9f9a000df88a6e6)
图12.3 运行前效果图
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P236_3.jpg?sign=1739275790-9ZQ5AN1bhLbbQ8y5TOQ6ZNrPn3gJvU5W-0-87b9da5c105223c1f7039234e967aeeb)
图12.4 运行后效果图
常见错误
如图片不显示或中文汉字乱码,请先检查index.php编码格式是否为UTF-8;然后检查定义的字体是否支持中文,在C:\Windows\Fonts文件夹下,查找支持中文的字体,如“黑体”为simhei.ttf,“仿宋”为simfang.ttf。
12.2.3 使用图像处理技术生成验证码
验证码功能的实现方法很多,有数字验证码、图形验证码和文字验证码等。在本节中介绍一种使用图像处理技术生成的验证码。
【例12.02】 使用GD2函数生成验证码。(实例位置:资源包\源码\12\12.02)
图像处理技术生成验证码常用在用户登录过程中,下面在登录页面中实现该过程。程序的开发步骤如下。
(1)生成验证码。创建verify.php文件,用于生成验证码。在该文件中使用GD2函数创建一个4位的验证码,并且将生成的验证码保存在Session变量中,代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P237_1.jpg?sign=1739275790-aiRxC8vwS9SQCFSssawYXWJwYToTYdou-0-964c86a3ae352ca5129f1ef7007c7e76)
在上面的代码中,对验证码进行输出时,每个字符的位置、颜色和字体都是通过随机数来获取的,并且使用imagesetpixel()函数设置干扰点,可以在浏览器中生成各式各样的验证码,还可以防止恶意用户攻击网站系统。此外,为了后续检测验证码,使用session_start()函数开启Session,并将生成的验证码存入Session。运行结果如图12.5所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P238_1.jpg?sign=1739275790-hXLwN9qH8i1B5Vok0XlasPJQIAs2VkYM-0-cb0b62519d85202857a5e113a75934cd)
图12.5 生成的验证码
(2)显示验证码。创建login.php文件,该文件包含用户登录的表单,并调用checks.php文件,在表单页中输出验证码图像的内容。代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P238_2.jpg?sign=1739275790-3b9jecL69YdY3vLsoT89ufc4WGExzgww-0-2e3bec1c8c0dd34197a5ffe9b7367d72)
上述代码中,<img>标签中有如下代码:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P239_2.jpg?sign=1739275790-1lSVDGq0zHpMRWoLAMJA2DtSi6aF8jjz-0-f5f5aa1bddd7ffc65fbe2002253bf814)
src属性值为verify.php,由于verify.php使用:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P239_3.jpg?sign=1739275790-LrtqdvqpXqDUv2RrhMeb3UD70XCxRfzw-0-3614a450cfeb7270816bc7485633ebdb)
即生成内容为图片格式。所以,登录页面会显示verify生成的验证码图片,运行结果如图12.6所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P239_4.jpg?sign=1739275790-wNZK3Rr0qpiroNlVskaC6w75fBiJPmAV-0-79dbde31f8ff4cfc78a307ffe65757ee)
图12.6 登录页面显示验证码
(3)检测验证码。在登录页面单击“提交”按钮后,会将表单提交到checkLogin.php页面。创建checkLogin.php文件,用于检测用户提交的验证码是否正确。由于在verify.php文件中,已经将生成的验证码存入Session中,所以只需要判断用户输入的验证码和Session值是否相等即可。checkLogin. php文件的代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P239_5.jpg?sign=1739275790-ntcmG44NZbNiljFq5XUSGRWXaW86Q683-0-7d7a4040b81fafa91c3526cfac3baacc)
在登录页面中,输入用户名和密码,在“验证码”文本框中输入验证码信息,单击“提交”按钮,对验证码的值进行判断,注意区分大小写字母。验证码正确的运行效果如图12.7所示,验证码错误的运行效果如图12.8所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P240_2.jpg?sign=1739275790-wMtTiqf7TQJZqTFp9zf7oYM9TT4ay2HF-0-a9d2d32104b267bc85aa16382eecc6cb)
图12.7 验证码正确的运行效果
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P240_3.jpg?sign=1739275790-3qD8fPlyR7z2DC7fZx59aJQQTKJxvjyF-0-ee39ff4fe64f8685b2dcd2ec81dff78e)
图12.8 验证码错误的运行效果
12.3 JpGraph图像绘制库
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P240_4.jpg?sign=1739275790-uQI9Anlolo9W03bNVkDZtg2YsTw9XrXh-0-cfb7bc238311ad58f9d5a6ee642f40d8)
视频讲解
JpGraph是一种面向对象的图像绘制库,其基于GD2函数库,对其中函数进行封装,可以直接使用生成统计图的函数。JpGraph可以生成X-Y坐标图、X-Y-Y坐标图、柱形图、折线图、3D饼形图等统计图,并会自动生成坐标轴、坐标轴刻度、图例等信息,帮助我们快速生成所需样式。
JpGraph这个强大的绘图组件能根据用户的需要绘制任意图形。只需要提供数据,就能自动调用绘图函数的过程,把处理的数据输入自动绘制。JpGraph是一个完全使用PHP语言编写的类库,并可以应用在任何PHP环境中。
12.3.1 JpGraph的下载
JpGraph可以从其官方网站http://JpGraph.net/download下载。注意JpGraph支持PHP 5和PHP 7,笔者写作本书时最新的版本是4.0.2。
JpGraph的安装方法非常简单,文件下载后,安装步骤如下。
(1)将下载的压缩包解压。解压后,将jpgraph-4.0.2文件夹下的src文件夹复制到项目文件夹下。本项目将复制到D:\phpStudy\WWW\Code\SL\12文件夹下。
(2)将src文件夹重命名为jpgraph。目录结构如图12.9所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P241_1.jpg?sign=1739275790-MKa1kfS8WlxrTGIbVPyfmISDhm6XEhsC-0-bddb1ed35916b79e0fe74fae67370525)
图12.9 jpgraph文件目录结构
12.3.2 JpGraph的中文配置
JpGraph生成的图片包含中文时,会出现中文乱码现象。解决此问题,需要对下面3个文件进行修改。
修 改jpgraph_ttf.inc.php。路径是D:\phpStudy\WWW\Code\SL\12\jpgraph\jpgraph_ttf.inc.php。在jpgraph_ttf.inc.php文件中,将代码:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P241_2.jpg?sign=1739275790-Xzl8Z6zY5ARIPdEglCIYvohj240GhxNY-0-81a9d87b9186fd2ff1974f2a8f662d6d)
修改为:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P241_3.jpg?sign=1739275790-ZLequPu30SQxkfyp3f409VxlCrSzwjWf-0-97973d0f01b2cb16406f6510ac511405)
其中simhei.ttf是中文黑体,更多中文字体可以在C:\Windows\Fonts文件夹下选择。
修改jpgraph_legend.inc.php。路径是D:\phpStudy\WWW\Code\SL\12\jpgraph\jpgraph_legend. inc.php。
在jpgraph_legend.inc.php文件中,将代码:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P241_4.jpg?sign=1739275790-AVm3v5QZUYeC63iWfymdu1bhxnS7pmYE-0-0132198c71557333b69882cfb75f07b8)
修改为:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P242_1.jpg?sign=1739275790-8W6iGRK5e6MwMYdZas0WP1MPT4WKAZsy-0-60f97be38b508ec20ddec63fb5bfab09)
修改jpgraph.php。路径是D:\phpStudy\WWW\Code\SL\12\jpgraph\jpgraph.php。在jpgraph.php文件中,将代码:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P242_2.jpg?sign=1739275790-jedw2JJGv7wlFJkFJtRywpfH3RPfsPZT-0-af70ffb891b2910de921dc5570d522c6)
修改为:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P242_3.jpg?sign=1739275790-Zkqs1C31r5M0enUNEbSEpPLHQMLmRC1T-0-9edc6100c0cd49af9c93e2a3c69f780a)
12.3.3 JpGraph的使用
完成12.3.2节的中文配置后,本节以基本的折线图为例,讲解如何使用JpGraph,以及如何显示中文字体。生成折线图的步骤如下。
(1)引入类文件。首先使用require_once语句引入jpgraph.php文件,由于要画折线图,接下来使用require_once语句引入jpgraph_line.php折线图类文件。
(2)创建Graph对象,设置相关属性,包括X轴、Y轴坐标刻度,折线图标题及标题字体,X轴数据等。
(3)创建LinePlot坐标对象,并导入Y轴数据。
(4)坐标对象注入图表对象。
(5)显示图片。
以明日学院小班课报名人数为例,生成折线图。在折线图中,X轴显示月份、Y轴显示人数,并设置折线为蓝色。具体代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P242_4.jpg?sign=1739275790-xLU7oITlFtWcz8rCv1dUujY3Xe6ImYq3-0-5019261bc796eec7142515f544d3e0b9)
运行效果如图12.10所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P243_1.jpg?sign=1739275790-VgiPW76gKuX98BR4le0GLOeqHJlIpcTA-0-e7954f7a7eb1db5d1a046950be772985)
图12.10 报名人数折线图
注意
在使用$graph->title->Set()设置标题前,如果标题为中文,需要先使用$graph->title->SetFont(FF_CHINESE)设置字体。
12.4 JpGraph典型应用
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P243_2.jpg?sign=1739275790-UVV1DTtD5donZOcZbDdnf584dnfHGRb6-0-b5f076d2db56f60a253b83e7a97afc97)
视频讲解
网页中如果没有丰富多彩的图形图像总是缺少生气,漂亮的图形图像能让整个网页看起来更富有吸引力,使许多文字难以表达的思想一目了然,并且可以清晰地表达出数据之间的关系。下面对图形图像处理的各种技术进行讲解。
12.4.1 使用柱形图统计图书月销售量
柱形图的使用在Web网站中非常广泛,它可以直观地显示数据信息,使数据对比和变化趋势一目了然,从而可以更加准确、直观地表达信息和观点。
【例12.03】 使用柱形图统计图书月销售情况。(实例位置:资源包\源码\12\12.03)
使用JpGraph类库实现柱形图统计图书月销售情况。创建柱形分析图的详细步骤如下。
(1)使用require_once语句引用jpgraph.php文件。
(2)采用柱形图进行统计分析,需要创建BarPlot对象,BarPlot类在jpgraph_bar.php中定义,需要使用require_once语句引用该文件。
(3)创建Graph对象,生成一个850像素×600像素大小的画布,设置X轴、Y轴刻度类型,设置X轴、Y轴数据。
(4)创建一个矩形的对象BarPlot,设置其柱形图的颜色、柱体间距。
(5)将绘制的柱形图添加到画布中。
(6)添加标题名称。
(7)输出图像。
本实例的完整代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P244_1.jpg?sign=1739275790-i8u9tXu4XcgUB38pJVQq4uFb3Ptdu6Ux-0-9c009ee9736441ad9b2856d0b906f6dc)
本实例的运行结果如图12.11所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P244_2.jpg?sign=1739275790-UBC1bpP7IjaTISauGG5ocmE47kV0xIMV-0-984fc10a703d044a2af702e0eb9dfc98)
图12.11 应用柱形图统计图书月销量
12.4.2 使用折线图统计3本图书销售量
折线图的使用同样十分广泛,如商品的价格走势、股票在某一时间段的涨跌等,都可以使用折线图来分析。
【例12.04】 使用折线图统计3本图书销售量。(实例位置:资源包\源码\12\12.04)
使用JpGraph类库实现折线图统计3本图书上半年销售量。创建折线图的详细步骤如下。
(1)使用require_once语句引用jpgraph.php文件。
(2)采用折线图进行统计分析,需要创建LinePlot对象,而LinePlot类在jpgraph_line.php中定义,需要应用require_once语句引用该文件。
(3)创建Graph对象,生成一个850像素×600像素大小的画布,设置X轴、Y轴刻度类型,设置X轴、Y轴数据。
(4)创建3个对象LinePlot,设置折线的颜色和图例名称。
(5)将绘制的折线图添加到画布中。
(6)输出图像。
本实例的完整代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P245_1.jpg?sign=1739275790-igZ0iGlA5cDKdwjq11giATuNKC4EI7wy-0-c02ed5a9be4832210c8c2cc3c5a0f3ed)
本实例的运行结果如图12.12所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P246_2.jpg?sign=1739275790-6p2fduYXxUJz7J2IpcZ6021JKIbZgOmX-0-933fbaf2ddca5bde16ac56198bf886da)
图12.12 应用折线图统计图书上半年销售量
12.4.3 使用3D饼形图统计各类商品的年销售额比率
饼形图是一种非常实用的数据分析技术,可以清晰地表达出数据之间的关系。在调查商场某类商品的年销售额比率时,最好的显示方式就是使用饼形图,通过饼形图可以直观地看到某类产品的销售额在所有商品中所占有的比例。
【例12.05】 统计各类商品的年销售额比率。(实例位置:资源包\源码\12\12.05)
使用3D饼形图统计各类商品的年销售额比率的步骤与创建其他图形的步骤大致相同,不再赘述,程序完整代码如下:
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P246_3.jpg?sign=1739275790-96CZ1gp4irpIGCOrQxFeii5KeVgXOEvm-0-1003ded9a9e2304f745762d7eaf3ab74)
运行结果如图12.13所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P247_2.jpg?sign=1739275790-wTQCn78AQfNdtDJxA1QQO8d35eLQkEf2-0-92ffc7cafef7b54419ed1d064d7e51e2)
图12.13 应用3D饼形图统计各类商品的年销售额比率
12.5 小结
本章首先介绍了GD2函数库的安装方法,以及应用GD2函数创建图像,使读者对GD2函数有一个初步的认识。接着介绍了一个专门用于绘制统计图的类库——JpGraph。通过讲解JpGraph类库的安装、配置到实际的应用过程,指导读者熟练使用该类库,完成更复杂的图形图像的开发。
12.6 实战
12.6.1 生成缩略图
实例位置:资源包\源码\12\实战\01
试着生成一张图片的缩略图,缩放比例为0.2,缩放前后对比如图12.14所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P248_1.jpg?sign=1739275790-awGJP9ZKfrAlwgs2X6fG8fSgL1faKjXb-0-8f1c95c61b89742ae62b5e4ff53e5914)
图12.14 图片缩放前后对比
12.6.2 生成中文图像验证码
实例位置:资源包\源码\12\实战\02
修改例12.02,生成中文图像验证码,如图12.15所示。
![](https://epubservercos.yuewen.com/3D7998/18562448408358606/epubprivate/OEBPS/Images/Figure-P248_2.jpg?sign=1739275790-6cpbOgBdNivOmYdbvVLELCRmns4z7ngr-0-11dfbd0fae82be49f55f004797003fa5)
图12.15 生成中文图像验证码