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

一起来学习PHP中GD库的使用吧(三)

时间:2023-03-29 14:01:26 PHP

在上一篇文章中,我们学习了GD库的一个应用,这是一个非常常用的制作验证码的功能。不过在实际业务开发中,这种简单的验证码已经用的不多了,大家会制作比较复杂的验证码来使用。毕竟现在各种外挂软件都可以轻松破解这个简单的图片验证码。当然,我们也可以对其进行简单的改造,比如使用中文,按顺序点击,都可以比较容易的实现。对于比较复杂的验证码,建议使用一些开源的库或者API。今天,我们继续学习GD库的一些常见应用。还是通过一些小例子来学习,这也是我们日常开发中非常常用的一些功能。生成缩略图在日常的开发过程中,无论是客户上传的图片还是我们自己在后台上传的图片,其尺寸不一定是我们需要的尺寸。这时候,缩略图的作用就更加重要了。一般我们会在保留原图的基础上,生成一个与原图对应的缩略图,用于首页统一尺寸的展示。$w=图片x($im);$h=图像($im);$imNew=imagecreatetruecolor($w/2,$h/2);imagecopyresized($imNew,$im,0,0,0,0,$w/2,$h/2,$w,$h);header("Content-type:image/jpg");imagejpeg($imNew);imagedestroy($imNew);上面代码中,缩略图的缩略图是原图的一半大小,用到了imagecopyresized()函数。它的参数是新图像画布、原图像、新图像x、y坐标起点、原图像x、y坐标起点、新图像。图片的大小,原图的大小。参数很多,但也很容易理解,就是将原图缩小到指定大小,放在新的画布上。imagesx()和imagesy()函数并不是从字面上理解x和y坐标点,它们实际上是获取图像句柄文件的宽和高。如果我们输出一张jpg格式的图片,我们还可以指定它的压缩比。$w=图片x($im);$h=图像($im);$imNew=imagecreatetruecolor($w/2,$h/2);imagecopyresized($imNew,$im,0,0,0,0,$w/2,$h/2,$w,$h);header("Content-type:image/jpg");imagejpeg($imNew,null,10);imagedestroy($imNew);即imagejpeg()函数的最后一个参数与PS导出图片时的压缩率相同,数字越小压缩率越高,反之数字越大,压缩比越低,画质越好。默认值为75,压缩比可设置0-100。第二个参数仍然是图片保存路径。我们这里测试的代码还是直接从浏览器输出的,所以这里给一个null。从画质来看,确实比之前直接缩小的画面模糊了很多。当然,图片的尺寸也小了很多。对于网站优化来说,jpg图片的压缩比一般在75左右,这是默认值。如果太小,会过于模糊,影响用户体验。具体业务具体分析,需要的图片大小要根据我们的实际情况来定。另一种生成指定尺寸等比例缩略图的业务案例是我们前台展示的图片尺寸是一样的,比如列表中商品图片的展示。这时候很多图片直接压缩可能会失去比例。比如我们上传了一张16:9的宽幅图片,图片在首页列表页的位置是一张4:3的图片。这里我们要根据最大宽度缩放或者最大高度缩小,同时多出来的部分留白边或者透明边。这时候只要计算图片的比例就可以了。$w=imagesx($im);$h=imagesy($im);$imNew=imagecreatetruecolor(202,152);imagefill($imNew,0,0,imagecolorallocate($imNew,255,255,255));imagerectangle($imNew,0,0,201,151,imagecolorallocate($imNew,0,0,0));$SW=0;$sH=0;如果($w/$h>200/150){$q=200/$w;$sH=$h*$q;$sW=$w*$q;$sX=0;$sY=(150-$sH)/2;}else{$q=150/$h;$sH=$h*$q;$sW=$w*$q;$sX=(200-$sW)/2;$sY=0;}imagecopyresized($imNew,$im,$sX+2,$sY+1,0,0,$sW,$sH,$w,$h);header("内容类型:图片/jpg");imagejpeg($imNew);imagedestroy($imNew);in在测试代码中,我们规定的尺寸是200*150的图片尺寸,即4:3的图片规格。需要操作的图片为300*244的非标准图片。这个时候我们通过计算宽高比来决定是按宽缩还是按高缩。如果原图的纵横比大于我们规定的图片纵横比,则认为是在宽度的基础上缩小了。反之,则因高度而减少。同样,具体宽高结果的算法都是按照相应的比例进行缩小。同时,我们还需要计算图片的位置,应该放在中心位置。最后将缩小后的尺寸放入指定尺寸的画布中。我们测试代码中的canvas多了两个像素来画黑边,目的是为了演示可以看清楚。可以看到缩放后,我们是根据原图的高度进行缩放的,所以图片的两边都会出现白边。如果是基于宽度的话,图片的上下会出现白边。当然,如果原图的比例和我们需要的比例一样,就会完全填满整个画布。您可以自己用其他尺寸的图片进行测试。图片水印除了缩略图,水印功能也是很多业务开发中必备的功能。直接文字水印其实不用多说。上一篇中的imagettftext()直接添加即可。您只需要使用imagecolorallocatealpha()函数为其指定透明颜色即可。今天我们主要讲的是添加图片水印。$imNew=imagecreatetruecolor(150,30);imagecolortransparent($imNew,imagecolorallocatealpha($imNew,255,255,255,128));imagesavealpha($imNew,true);$font='../font/msyh.ttf';imagettftext($imNew,16,0,11,21,imagecolorallocate($imNew,255,255,255),$font,'铁杆项目经理');if(imagesx($im)>150+10&&imagesy($im)>60+10){imagecopy($im,$imNew,imagesx($im)-150-10,imagesy($im)-30-10,0,0,150,30);imagecopymerge($im,$imNew,imagesx($im)-150-10,imagesy($im)-60-10,0,0,150,30,50);}header("Content-type:image/jpg");imagejpeg($im);imagedestroy($im);首先,我们使用imagecolortransparent()和imagesavealpha()指定透明画布。然后通过imagettftext()生成文字图片。注意,这里是图片,不是直接加文字。接下来,使用imagecopy()或imagecopymerge()将水印图像复制到原始图像上。这两个函数的区别在于imagecopymerge()多了一个参数来指定合并图片时通道的透明度。也就是说,如果是没有透明度的图片,可以直接使用这个功能给图片加上透明度。.添加水印前的判断用于判断图片的大小是否适合添加水印。如果图片小于水印文件,则不要加水印,或者缩小水印后再加水印。这样就完成了简单的水印添加。其实网上可以找到很多前人封装的水印类,或者Composer中有很多现成的库。这里只是做一个简单的手写效果,供大家学习复习。综上所述,图像GD库中的函数还是很多的,不过说实话,我现在用的不多了。为什么?在实际业务开发中,大家其实都习惯使用oss、七牛、upyun等云存储。无论是图片缩放、加水印,甚至是简单的做一些PS编辑,都非常方便。而且最重要的是不需要占用我们的服务器存储资源和带宽资源,何乐而不为呢。像我现在的工作,程序代码服务器基本上只需要原来的20G左右的大小。它只是运行代码,不存储上传的文件、图片和静态资源。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/3。一起学习PHP中GD库的使用(三)。PHP参考文档:https://www.php.net/manual/zh/book.image.php各媒体平台均可搜索【硬核项目经理】