共计 3891 个字符,预计需要花费 10 分钟才能阅读完成。
又到了一个大家十分相熟的库了,对于图像图形的解决来说,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
各自媒体平台均可搜寻【硬核项目经理】