一起学习PHP中GD库的使用(一)
又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎。从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们必备的一个扩展。当然,在现在的 PHP 版本中,相信大家也不会在编译的时候忽略掉这个库。不管你是为图片加水印、生成缩略图还是制作验证码图片,都离不开 GD 库的身影。
当然,我们还是由浅入深地学习一些 GD 库中的常用或好玩的函数。
当前环境中的 GD 库信息
首先,我们可以查看下当前 PHP 环境中的 GD 库版本及支持的图片格式信息。
var_dump(gd_info());
// array(13) {
// ["GD Version"]=>
// string(26) "bundled (2.1.0 compatible)"
// ["FreeType Support"]=>
// bool(true)
// ["FreeType Linkage"]=>
// string(13) "with freetype"
// ["GIF Read Support"]=>
// bool(true)
// ["GIF Create Support"]=>
// bool(true)
// ["JPEG Support"]=>
// bool(true)
// ["PNG Support"]=>
// bool(true)
// ["WBMP Support"]=>
// bool(true)
// ["XPM Support"]=>
// bool(false)
// ["XBM Support"]=>
// bool(true)
// ["WebP Support"]=>
// bool(true)
// ["BMP Support"]=>
// bool(true)
// ["JIS-mapped Japanese Font Support"]=>
// bool(false)
// }
gd_info() 函数可以查看到当前 GD 库的版本信息,其它字段就是各种图片模式的支持情况,可以看到在我的系统环境中,除了 XPM 这种格式不支持外,其它各种图片格式都是正常支持的。最后一个是日文字体的支持,我们当前环境中也是没有的。
获取图片基本信息
getimagesize(),获取图片信息的这个函数,从名字上看是获取图片大小的一个函数但也包含一些其它的信息,而且这个函数其实和 GD 库没什么太大的关系,也就是说不需要 GD 库的扩展其实这个函数也是可以使用的。
var_dump(getimagesize("../img/1.png"));
// array(6) {
// [0]=>
// int(150)
// [1]=>
// int(150)
// [2]=>
// int(3)
// [3]=>
// string(24) "width="150" height="150""
// ["bits"]=>
// int(8)
// ["mime"]=>
// string(9) "image/png"
// }
返回的结果其实非常简单,0 和 1 分别就是图片的宽高,2 是图片的类型,之前的文章就讲过它对应的就是 IMAGETYPE_ 常量中对应的图片类型。3 是文字形式的图片宽高,可以直接用于 img 标签中,可以看出来,PHP 真的就是为了 web 而生的语言啊,连图片大小获取的函数都要带个这样的属性回来。bits 就是图片的 颜色比特位数 。mime 则是图片的 MIME 类型了。
另外,getimagesize() 函数还有第二个参数,这是一个引用类型的参数,它将以一个关联数组返回不同的 JPG APP 标识。也就是说,它也是针对 JPG 相关的图片获取一些额外的信息,其实就有点像上篇文章学习过的 EXIF 里面的信息。
var_dump(getimagesize("../img/2.jpg", $info));
// array(7) {
// [0]=>
// int(300)
// [1]=>
// int(244)
// [2]=>
// int(2)
// [3]=>
// string(24) "width="300" height="244""
// ["bits"]=>
// int(8)
// ["channels"]=>
// int(3)
// ["mime"]=>
// string(10) "image/jpeg"
// }
var_dump($info);
// array(1) {
// ["APP0"]=>
// string(14) "JFIF��"
// }
此外,我们如果是 JPG 图片的话,还会多返回一个 channels 属性,表示的是如果图片是 RBG 格式的,返回的就是 3 ,如果是 CMYK 格式的,返回的就是 4 。
我们还可以使用 getimagesize() 获得远程文件的信息。
var_dump(getimagesize("https://upload-images.jianshu.io/upload_images/1074666-8df66a94d61cac74.png?imageMogr2/auto-orient/strip|imageView2/2/w/374/format/webp"));
// array(6) {
// [0]=>
// int(374)
// [1]=>
// int(617)
// [2]=>
// int(18)
// [3]=>
// string(24) "width="374" height="617""
// ["bits"]=>
// int(8)
// ["mime"]=>
// string(10) "image/webp"
// }
除了直接操作图片文件之外,我们还可以直接从字符串中获得图片的信息。不过这些字符串一般也都是读取到的图片文件的二进制信息。你直接来一句真正的 Hello World 之类的字符串那打死它也解析不出来什么图片内容的。
$data = file_get_contents('../img/1.png');
var_dump(getimagesizefromstring($data));
// array(6) {
// [0]=>
// int(150)
// [1]=>
// int(150)
// [2]=>
// int(3)
// [3]=>
// string(24) "width="150" height="150""
// ["bits"]=>
// int(8)
// ["mime"]=>
// string(9) "image/png"
// }
获得图片的一些信息
我们可以通过图片的类型来获取文件的扩展名,这个类型常量也是 IMAGETYPE_ 类型的。
var_dump(image_type_to_extension(IMAGETYPE_PNG)); // string(4) ".png"
var_dump(image_type_to_extension(IMAGETYPE_JPEG, FALSE)); // string(4) "jpeg"
image_type_to_extension() 函数有第二个参数,如果设置为 false 的话,就不会加上那个 . 。
var_dump(image_type_to_mime_type(IMAGETYPE_PNG)); // string(9) "image/png"
var_dump(image_type_to_mime_type(IMAGETYPE_JPEG)); // string(10) "image/jpeg"
同样地,也有 image_type_to_mime_type() 这个函数来获得图片的 MIME 信息内容。另外,还有一个函数可以获得当前系统中所支持的图片类型都有哪些。
var_dump(imagetypes()); // int(111)
额,很奇怪吧,怎么只返回了一个 111 ?其实它是保存的二进制图片支持信息,比如如果我们想知道当前系统中有没有 PNG 图片的支持,就可以这样使用:
var_dump(imagetypes() & IMAGETYPE_PNG); // int(3)
和 IMAGETYPE_PNG 与之后的结果就是 IMAGETYPE_PNG 本身的值,这就说明当前系统中是支持这个图片类型的操作的。
小例子:创建一张自己的图片
最后,我们再来看一个小例子,其实就是利用 GD 库中的这些函数来创建一张简单的小图片。
$im = @imagecreate(100, 50) or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "Test 测试", $text_color);
imagepng($im, '../img/test.png');
imagedestroy($im);
其实每个函数的内容都很好理解,函数名就已经写得很清楚了。当然,我们后面的文章中将详细地再学习一次。这个最终生成的图片中,中文也是乱码的,不过它已经是可以当做一个图片验证码来使用了,是不是非常地简单?
总结
今天的内容不多,也都是比较基础浅显的一些函数的使用。当然,这只是开头的第一篇文章,GD 库不是一个简单的小扩展,它里面的内容非常多,能够实现的功能也非常复杂,不要走开,持续关注哦!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/1.一起学习PHP中GD库的使用(一).php
参考文档:
https://www.php.net/manual/zh/book.image.php
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
一起学习PHP中GD库的使用(一)的更多相关文章
- 一起学习PHP中GD库的使用(三)
上篇文章我们已经学习了一个 GD 库的应用,那就是非常常用的制作验证码的功能.不过在现实的业务开发中,这种简单的验证码已经使用得不多了,大家会制作出更加复杂的验证码来使用.毕竟现在的各种外挂软件已经能 ...
- 一起学习PHP中GD库的使用(二)
在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...
- 【代码学习】PHP中GD库的使用
PHP--GD库 ================================================ 一.支持: 需要php支持GD库 二.作用: 验证码.水印.缩放等 三.绘画步骤: ...
- php中GD库的简单使用
在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...
- php中GD库的一些简单使用
今天了解了一些GD库的简单使用,现在稍微做一下总结! GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处 ...
- (转)php中GD库的配置,解决dedecms安装中GD不支持问题
了解gd库 在php中,使用gd库来对图像进行操作,gd库是一个开放的动态创建的图像的源代码公开的函数库,可以从官方网站http://www.boutell.com/gd处下载.目前,gd库支持gif ...
- PHP中GD库安装
安装gd库扩展不能像其他扩展安装一样,直接./configure --prefix=/xxx 还需要激活png,jpeg,字库等支持 ./configure --prefix=/xxx --with- ...
- PHP中GD库是做什么用的? PHP GD库介绍11111111
什么是gd库? gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片. 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据 ...
- 关于织梦系统不支持php中GD库的问题
大多数人在显成的PHP的CMS时,如织梦CMS,安装的时候不支持GD库,就导致整个网站的验证码不显示,以下是个人对此类问题的解决办法: 1.首先找到wamp的安装目录,找到PHP的文件夹,打开php. ...
随机推荐
- 跟我一起写 Makefile(十二)
隐含规则 ---- 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj ...
- Mysql5.7.34 数据库源码编译安装
Mysql 数据库源码编译安装 MySQL是一个关系型数据库管理系统,关系型数据库是将数据保存在不同的表中,而非将所有数据放在一个大仓库内,这样就加快了速度并提高了灵活性.由于其体积小.速度快.总体拥 ...
- Devcpp(Dev-C++)代码编辑的快捷键
转自:https://blog.csdn.net/u010940020/article/details/43735549 这里记录一些个人使用Devcpp时,摸索出来的代码编辑快捷键,感觉非常有用.如 ...
- Java HashMap【笔记】
Java HashMap[笔记] HashMap HashMap 基本结构 HashMap 底层的数据结构主要是数组 + 链表 + 红黑树 其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑 ...
- spring-data-jdbc的基础使用(一)
前言 很多人知道Mybatis,知道Jpa,但是对spring-data-jdbc可能了解的少之又少.注意我们这里说的是data-jdbc,而不是普通的jdbc.它拥有了类似jpa的一些特性,比如能够 ...
- 第8篇-dispatch_next()函数分派字节码
在generate_normal_entry()函数中会调用generate_fixed_frame()函数为Java方法的执行生成对应的栈帧,接下来还会调用dispatch_next()函数执行Ja ...
- 008 PCI设备BAR空间的初始化
一.PCI设备BAR空间的初始化 在PCI Agent设备进行数据传送之前,系统软件需要初始化PCI Agent设备的BAR0~5寄存器和PCI桥的Base.Limit寄存器.系统软件使用DFS算法对 ...
- uniapp 实现信息推送(App)
废话不多说直接上代码 以下代码需写在onlaunch生命周期内 onlaunch(){// onlaunch应用级生命周期 :当uni-app 初始化完成时触发(全局只触发一次) //#ifdef A ...
- 3、二进制安装K8s之部署kube-apiserver
二进制安装K8s之部署kube-apiserver 一.生成 kube-apiserver 证书 1.自签证书颁发机构(CA) cat > ca-config.json <<EOF ...
- FTP 大文件传输问题 解决
问题描述 将附件上传至FTP服务器,但是当附件过大,其大小为几百兆或1-2G时,会出现上传失败的现象 FTP上传原理解析 这里我们使用的是.Net的FtpWebRequest 创建FtpClient ...