一起学习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

一起学习PHP中GD库的使用(一)相关推荐

  1. PHP 中 GD库(以及Jpgraph库) 的配置和使用。(满屏荒唐言,一把辛酸泪)

    PHP 中 GD库(以及Jpgraph库) 的配置和使用 (满屏荒唐言,一把辛酸泪)搞这种配置什么的真的太痛苦了! 一.安装前说明. 我的安装环境是,windows + IIS +php 首先我们要理 ...

  2. php中gd库的使用,php GD库的使用

    两大功能:自己画,对于原有图片改变 PHP中GD库的使用 PHP 不仅限于只产生 HTML 的输出,还可以创建及操作多种不同格式的图像文件.PHP提供了一些内置的图像信息函数,也可以使用GD函数库创建 ...

  3. php中GD库的简单使用

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

  4. PHP中GD库的使用

    概述 GD 库是 php 处理图形的扩展库,GD 库提供了一系列用来处理图片的 API ,使用 GD 库可以处理图片,或者生成图片,也可以给图片加水印.在网站上 GD 库通常用来生成缩略图,或者用来对 ...

  5. 关于织梦系统不支持php中GD库的问题

    大多数人在显成的PHP的CMS时,如织梦CMS,安装的时候不支持GD库,就导致整个网站的验证码不显示,以下是个人对此类问题的解决办法: 1.首先找到wamp的安装目录,找到PHP的文件夹,打开php. ...

  6. php gd库 缩小图片_【源码分享】PHP中GD库实现图片等比例缩放

    //定义必备参数 $path = "./images"; $picname = "6.jpg"; $maxW = 200; //指定要缩放到的宽度 $maxH ...

  7. php gd图片验证,php笔记之GD库图片创建/简单验证码

    燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it php画图:比如说验证码,缩略图,加水印都要用到GD库,所以要开启gd2库,才能用 首先找到php.in ...

  8. php GD库的使用

    两大功能:自己画,对于原有图片改变 PHP中GD库的使用 PHP 不仅限于只产生 HTML 的输出,还可以创建及操作多种不同格式的图像文件.PHP提供了一些内置的图像信息函数,也可以使用GD函数库创建 ...

  9. wamp打开php,wamp本地php环境开启GD库教程

    很多朋友在使用Wampserver本地环境搭建织梦过程中,都会遇到登录后台验证码不显示的问题,那么是什么原因造成的呢?很可能就是Wampserver的GD库没有打开,今天木子网站就教大家wamp本地P ...

  10. PHP学习笔记-GD库与Jpgraph的使用

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52281196 本文出自:[顾林海的博客] 前言 学习PHP从第一篇笔记 ...

最新文章

  1. python使用base64编码解码数据
  2. Git - 使用指南
  3. 不得不看的17 个linux实用技巧
  4. TClientDataSet[22]: 数组字段与 ObjectView
  5. 用google mock模拟C++对象
  6. 自定义的OnFileSaveAs函数无法响应
  7. 神经网络激活函数对数函数_神经网络中的激活函数
  8. 【JavaWeb】JDBC优化 之 数据库连接池、Spring JDBC
  9. SSH详解以及免密登录配置,深入理解
  10. linux 临时文件 清理,Linux临时文件的清理
  11. 操作系统—基本地址变换机构
  12. Hive内部表和外部表
  13. SpringBoot之idea快捷键
  14. Maven依赖下载速度慢,不用怕,这么搞快了飞起
  15. 软件的界面测试是什么?怎么设计的?
  16. scsi 教程 linux,SCSI存储详解以及Linux下ISCSI的实现
  17. recovery介绍
  18. galaxy 用不了_开箱即用使Galaxy S9更好的六种方法
  19. c语言拼图小游戏编程,c语言控制台输出制作拼图小游戏
  20. 最终幻想之父——坂口博信 (转载自天幻网(www.SquareCN.com))

热门文章

  1. 中国品牌建设蜗行牛步,消费者成最大突破口?
  2. 广外艺计算机应用技术什么时候,广外艺公示2019高职自主招生录取名单,共485人,有你吗...
  3. Siggraph I3D 2022
  4. 开源Winform控件库:花木兰控件库
  5. 使用Vue.js框架搭建火车票查询系统
  6. windows服务器被当矿机的问题处理实战-conhosts.exe
  7. 洛谷3953 逛公园
  8. .xin域名亮相2017云栖大会·成都峰会(现场花絮)
  9. CH340预安装成功的解决方法
  10. uniapp引入echarts日历图 点击事件