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

创建图片并指定颜色

首先,我们要先创建一个图片的画布。就和 PhotoShop 一样,任何的绘图都要在一张画布下进行。

// 创建一个 200X200 的图像
$img = imagecreatetruecolor(200, 200);
// 分配颜色
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$red = imagecolorallocate($img, 255, 0, 0); // 带透明通道的颜色
$alphaRed = imagecolorclosestalpha($img, 255, 0, 0, 50);

imagecreatetruecolor() 函数就是用于创建一个真彩色图片,它和 imagecreate() 的区别就在于 imagecreate() 创建的是一张基于调色板的图片。它们为画布填充颜色的流程不一样,imagecreate() 不需要使用 imagefill() 进行填充背景色,直接使用 imagecolorallocate() 就会以第一次调用的 imagecolorallocate() 的颜色进行填充。它们返回的图片文件句柄都是后期操作所需要的句柄对象。

imagecolorallocate() 就是为图片分配颜色,这里我们定义了几种颜色,另外还使用 imagecolorclosestalpha() 定义了一个带通道的也就是还透明效果的颜色,它的最后一个参数就是 0-100 的透明度设置。

填充背景色

接下来,由于我们使用的是 imagecreatetruecolor() ,所以我们要对画布进行背景色的填充。

// 填充背景色
imagefill($img, 0, 0, $black);

弧线、直线、矩形

不管是画线还是画弧线,都只是一些简单的函数调用。

// 画一个白色的圆
imagearc($img, 100, 100, 150, 150, 0, 360, $white); // 画一条线段
imageline($img, 20, 180, 120, 120, $white); // 填充一个带透明的矩形
imagefilledrectangle($img, 30, 30, 70, 70, $alphaRed);

imagearc() 函数本身是用于画弧线的,第二和第三个参数用于指定圆心的位置,第四第五个参数指定圆的宽度和高度,第六、第七个参数指定弧线的起始位置(以角度指定),最后一个参数就是指定的颜色。通过给定的从 0 到 360 度的角度,我们就画了一个圆形出来。如果不是指定的完整的 360 度,就会是一条弧线。

直线线段的函数 imageline() 的参数就比较简单了,第二第三个参数是起始点的坐标,第四第五个参数是结束点的坐标,两个坐标点一连就绘制出了一条线段。

imagefilledrectangle() 是以填充的方式绘制一个矩形,也就是说我们绘制的矩形是在内部填充了颜色的,而不是线条的描边。它的参数坐标和线段是一样的,并且我们填充的是上面定义的带透明效果的颜色。

当然,我们能够直接绘制的图形和线条还有很多。需要注意的是,带 fill 关键字的基本都是填充图形,而不带 fill 的就是形状线段。比如如果要一个矩形框的话,我们可以使用 imagerectangle() 来进行绘制。同理,如果要画一个扇形块的话,我们也可以直接使用 imagefillarc() 。更多的图形和线段大家可以参考文档,内容比较多,这里就不多罗列了,今天我们主要的功能是生成一张验证码,只要有一个线段来做为干扰因素就可以啦。

写字

直接在图片中写字也很简单。

$string = "I Like PHP!";

// 水平写一个字符
imagechar($img, 5, 70, 50, $string, $red);
// 垂直写一个字符
imagecharup($img, 3, 120, 50, $string, $red); // 水平写字符串
imagestring($img, 5, 70, 150, $string, $red);
// 垂直写字符串
imagestringup($img, 3, 120, 150, $string, $red);

imagechar() 是只写一个字符,imagecharup() 是垂直地写。imagestring() 则是写字符串,而 imagestringup() 也就是垂直地写字符串啦。它们第二个参数都是字体的大小,第三和第四个参数是开始写字的坐标起始位置。不过,使用这些函数对图片进行内容书写的话,最主要的一个问题就是不能指定字体,这样在默认情况下中文是没办法输出的。所以,我们一般会用另一个函数来为图片加上文字。

// 用 TrueType 字体向图像写入文本
$font = '../font/arial.ttf';
imagettftext($img, 20, 0, 11, 21, $white, $font, $string);

imagettftext() 函数,能够通过指定的字体来向图片添加文字内容,有了字体文件的支持,写上去的文字也好看了很多。更主要的是,它还能方便地调整文字大小和倾斜角度。第二个参数就是指定文字的大小,第三个参数就是可以指定文字的倾斜角度,也就是我们可以旋转文字。

生成图片

最后,当然就是要生成并输出图片啦!

// 将图像输出到浏览器
header("Content-type: image/png");
imagepng($img);
// 释放内存
imagedestroy($img);

我们的测试代码是直接将图片输出到浏览器,所以需要指定一个文件输出的 header 头。使用 imagepng() 就能生成一张 PNG 格式的图片,它还有第二个参数,如果给定了第二个参数,那么图片就会直接以文件形式保存到参数指定的路径中。如果不给定这个参数的话,就会像 phpinfo() 一样直接输出到输出缓冲区中,也就是直接打印内容了。最后,我们再使用 imagedestroy() 释放掉图片句柄解除图片文件的内存占用。

除了 imagepng() 之外,还有 imagejpeg() 、 imagegif() 等等一系列的图片生成函数,大家可以自己查阅文档学习了解。

说了这么多,我们上面这一堆东西画出来的是个啥?

小例子:简单的验证码图片

最后的小例子就是一开头我们说过的,一个非常简单的图片验证码的生成。现在的验证码功能其实非常复杂了,各种形式的验证码都有,主要还是为了系统的安全着想。同样在 Composer 中也有很多现成的验证码组件供我们使用,其实我们并不需要自己去实现这样的验证码功能的,但学习嘛,总是要接触一下了解一下的,而且如果是一些很小的小项目的话,完全就可以自己手写一个来练习了。

$img = imagecreatetruecolor(120, 50);
imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255)); $colors = [
imagecolorallocate($img, 0, 0, 0),
imagecolorallocate($img, 255, 0, 0),
imagecolorallocate($img, 0, 255, 0),
imagecolorallocate($img, 0, 0, 255),
]; $chars = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z')); for ($i = 0; $i < 10; $i++) {
imageline(
$img,
random_int(0, 120),
random_int(0, 50),
random_int(0, 120),
random_int(0, 50),
$colors[array_rand($colors)]
);
}
$font = '../font/arial.ttf';
for ($i = 0; $i < 4; $i++) {
$char = $chars[array_rand($chars)];
$fontSize = random_int(18, 24);
$c = random_int(-20, 20);
$x = $i * 26;
if ($x == 0) {
$x = 5;
}
imagettftext(
$img,
$fontSize,
$c,
$x,
40,
$colors[array_rand($colors)],
$font,
$char
);
}
header("Content-type: image/png");
imagepng($img);
imagedestroy($img);

代码就不多做解释了,随机取一些字符,并且随机生成一些线段,其它的就是我们上面文章中介绍过的函数的使用了。最后生成的图片就是这个样子的:

总结

不管之前有没有自己写过这种验证码的小工具,今天的内容相信都是一次系统的学习和回顾,因为我们是按着顺序从创建一张图片画布,到绘制线条和图形,再到添加文字,最后生成图片这一系列的步骤走下来的。以后不管是面试还是自己做小工具的时候,记住这条线,然后参考文档就可以啦。毕竟这些函数的参数都还是挺长挺乱的,除非天天用,要不可真记不住。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/2.一起学习PHP中GD库的使用(二).php

参考文档:

https://www.php.net/manual/zh/book.image.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

一起学习PHP中GD库的使用(二)的更多相关文章

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

    上篇文章我们已经学习了一个 GD 库的应用,那就是非常常用的制作验证码的功能.不过在现实的业务开发中,这种简单的验证码已经使用得不多了,大家会制作出更加复杂的验证码来使用.毕竟现在的各种外挂软件已经能 ...

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

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

  3. PHP 使用GD库合成带二维码的海报步骤以及源码实现

    PHP 使用GD库合成带二维码的海报步骤以及源码实现 在做微信项目开发过程中,经常会遇到图片合成的问题,比如将用户的二维码合成到宣传海报中,那么,遇到这种情况,利用PHP的GD库也是很容易实现的,实现 ...

  4. PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现

    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现 之前记录过一篇文章,不过那只是简单将二维码合成到海报中去,这次还要合成头像,而且是圆形.所需要素材就不一一列举,直接代码吧 1.先获取用 ...

  5. 【代码学习】PHP中GD库的使用

    PHP--GD库 ================================================ 一.支持: 需要php支持GD库 二.作用: 验证码.水印.缩放等 三.绘画步骤: ...

  6. php中GD库的简单使用

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

  7. php中GD库的一些简单使用

    今天了解了一些GD库的简单使用,现在稍微做一下总结! GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处 ...

  8. (转)php中GD库的配置,解决dedecms安装中GD不支持问题

    了解gd库 在php中,使用gd库来对图像进行操作,gd库是一个开放的动态创建的图像的源代码公开的函数库,可以从官方网站http://www.boutell.com/gd处下载.目前,gd库支持gif ...

  9. PHP中GD库安装

    安装gd库扩展不能像其他扩展安装一样,直接./configure --prefix=/xxx 还需要激活png,jpeg,字库等支持 ./configure --prefix=/xxx --with- ...

随机推荐

  1. 项目中redisTemplate设置的key,redis客户端上查询不到的问题

    再项目使用了redis储存key,测试需要在客户端删除对应的key,发现查询不到对应的key redis客户端: 发现redisTemplate实际存进去的key会多了几个字符 原因:程序中对key没 ...

  2. DDD领域驱动理解

    在理解领域驱动的时候,网上很多大谈理论的文章,这种对于初学者不是太容易接受.根据我自己的学习经历,建议按照如下几个步骤学习: 粗略的看一遍领域驱动的理论,做到心中有形,知道领域驱动是什么,解决什么问题 ...

  3. GO语言安装以及国内镜像

    首先,下载GO语言,国内的话用 Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com) 可能会快一点 然后根据自己的系统选择下载的包,我是win10,就选go1.1 ...

  4. mybatis generator的generatorConfig.xml配置详解

    generatorConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ge ...

  5. 【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题

    问题描述 在.Net Core 5.0 项目中,添加 Microsoft.Extensions.Logging.AzureAppServices 和 Microsoft.Extensions.Logg ...

  6. 【Python机器学习实战】决策树和集成学习(二)——决策树的实现

    摘要:上一节对决策树的基本原理进行了梳理,本节主要根据其原理做一个逻辑的实现,然后调用sklearn的包实现决策树分类. 这里主要是对分类树的决策进行实现,算法采用ID3,即以信息增益作为划分标准进行 ...

  7. 如何选择Spring cloud和 Spring Boot对应的版本

    如何选择Spring cloud和 Spring Boot对应的版本 首先,我们进入Spring Cloud官网,查询Spring cloud的版本和对应的Spring Boot版本 打开Spring ...

  8. layui关闭弹出框

    layer.close(index) - 关闭特定层 //当你想关闭当前页的某个层时 var index = layer.open(); var index = layer.alert(); var ...

  9. Redis 在项目中合理使用经验总结

    转自:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...

  10. SpringBoot笔记(7)

    一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...