当前位置: 首页 > 后端技术 > PHP

一起来学习PHP中GD库的使用方法(一)

时间:2023-03-30 01:33:31 PHP

来到了大家非常熟悉的库。对于图像图形处理,GD库是PHPer绕不过去的一道坎。从很早的CMS或者Discuz开始,各种开源软件在安装的时候都会明确指出GD库是它们的必要扩展。当然,在现在的PHP版本中,相信大家在编译的时候都不会忽略这个库。无论是给图片加水印、生成缩略图还是制作验证码图片,都离不开GD库。当然,我们还是由浅入深地学习GD库中一些常用的或者有趣的函数。当前环境下的GD库信息首先,我们可以查看当前PHP环境下的GD库版本和支持的图片格式信息。var_dump(gd_info());//array(13){//["GDVersion"]=>//string(26)"bundled(2.1.0compatible)"//["FreeTypeSupport"]=>//bool(true)//["FreeTypeLinkage"]=>//string(13)"withfreetype"//["GIFReadSupport"]=>//bool(true)//["GIFCreateSupport"]=>//bool(true)//["JPEG支持"]=>//bool(true)//["PNG支持"]=>//bool(true)//["WBMP支持"]=>//bool(true)//["XPM支持"]=>//bool(false)//["XBM支持"]=>//bool(true)//["WebP支持"]=>//bool(true)//["BMPSupport"]=>//bool(true)//["JIS-mappedJapaneseFontSupport"]=>//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()函数还有第二个参数,是一个引用类型的参数,会以关联数组的形式返回不同的JPGAPPID。也就是说,对于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图片,会返回一个额外的channel属性,也就是说如果图片是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"//}除了直接操作图片文件,我们还可以直接从字符串中获取图片信息。但是,这些字符串一般都是读取图像文件的二进制信息。如果像HelloWorld这样直接拿出一个真正的字符串,就算杀了也解析不出任何图片内容。$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()获取images的MIME消息内容。另外还有获取当前系统支持的图片类型的函数。var_dump(图像类型());//int(111),奇怪,为什么只返回一个111?其实就是保存的二值图像支持信息。比如我们想知道当前系统是否支持PNG图片,可以这样使用:var_dump(imagetypes()&IMAGETYPE_PNG);//int(3)andIMAGETYPE_PNGandthefollowing结果是IMAGETYPE_PNG本身的值,表示当前系统支持对这种图片类型的操作。小例子:制作一张属于自己的图片最后我们来看一个小例子,就是利用GD库中的这些函数制作一个简单的小图片。$im=@imagecreate(100,50)ordie("无法初始化新的GD图像流");$background_color=imagecolorallocate($im,255,255,255);$text_color=imagecolorallocate($im,233,14,91);imagestring($im,1,5,5,"测试测试",$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各媒体平台均可搜索【硬核项目经理】