共计 3752 个字符,预计需要花费 10 分钟才能阅读完成。
上篇文章咱们曾经学习了一个 GD 库的利用,那就是十分罕用的制作验证码的性能。不过在事实的业务开发中,这种简略的验证码曾经应用得不多了,大家会制作出更加简单的验证码来应用。毕竟当初的各种外挂软件曾经可能轻松地破解这种简略的图片验证码了。当然,咱们也能够简略地对他进行变形,比方应用中文而后按程序点击之类的,这些都比较简单地就能实现。更简单的验证码则举荐应用一些开源的库或者 api 来实现。
明天,咱们将持续学习 GD 库的一些罕用的利用。仍然是通过一些小例子来进行学习,同样也是咱们在日常开发中十分罕用的一些性能。
生成缩略图
在日常的开发过程中,不论是客户还是咱们本人在后盾上传的图片,大小可能都不肯定是咱们须要的尺寸,这个时候缩略图的性能就比拟重要了。个别咱们会在保留原图的根底上生成对应原图的一张缩略图用于前台对立尺寸页面的展现。
$w = imagesx($im);
$h = imagesy($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 = imagesx($im);
$h = imagesy($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;
if ($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("Content-type: image/jpg");
imagejpeg($imNew);
imagedestroy($imNew);
在测试代码中,咱们规定的大小是 200*150 的图片大小,也就是 4:3 的图片规格。而须要操作的图片则是 300*244 的一张不太标准的图片。这时,咱们通过计算 宽 / 高 的比例,来确定是以宽为基准进行放大还是以高为基准进行放大。如果原图的宽高比大于咱们规定的图片宽高比,则认为是以宽度为基准进行放大。反之,就是以高度进行放大。同样地,具体的宽高后果的算法都都是基于对应的比率进行等比例放大的。同时,咱们还要计算图片的地位,要放在居中的地位。最初,再将放大的大小放入到指定大小的画布中。
咱们这段测试代码中的画布多了两个像素,是为了画那个彩色的边框,目标也是为了演示可能看清楚。
能够看到,咱们等比例缩放之后是以原图的高为基准进行缩放的,所以图片的两边会呈现白边。如果是以宽为基准的,那么图片高低会呈现白边。当然,如果原图的比例和咱们须要的比例是一样的,就会残缺地撑满整个画布。大家能够本人用其它大小的图片测试一下。
图片加水印
除了缩略图之外,加水印的性能也是很多业务开发中必备的性能。间接的文字水印其实就不必多说了,上篇文章中的 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
各自媒体平台均可搜寻【硬核项目经理】