怎么在PHP中利用Nginx实现一个动态裁剪图片功能

介绍

这期内容当中小编将会给大家带来有关怎么在PHP中利用Nginx实现一个动态裁剪图片功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>一、思路再现:

1,先写好请求服务器生成图片动态脚本,主要就是对图片进行等比缩放计算+裁剪。
2,确定你想要生成的url规则,比如https://cache.yisu.com/upload/information/20201209/266/42971.jpg。
3,对浏览器做缓存处理。
4,结束。
二,动态裁剪PHP脚本

代码如下:


/* *
, *作者pony_chiang
, *高性能图像裁剪方案
, *需要php-imagick扩展
, */
报错(“memory_limit",“80 m");

//请求地址比如,https://cache.yisu.com/upload/information/20201209/266/42972
//nginx重写规则,重写^ ([^ \]*)/s/(. *)/(\ d +) x (\ d +) - (\ d)/(. *) $ 1/s/resize.php ?网站=2美元,宽度=3美元,身高=4美元,模式=5美元,路径=6美元;

=$ path修剪($ _GET [& # 39; path & # 39;]);
模式=intval中美元($ _GET[& # 39;模式# 39;]);
网站=削减美元($ _GET[& # 39;网站# 39;]);
$宽度=intval中($ _GET[& # 39;宽度# 39;]);
身高=intval中美元($ _GET[& # 39;高度# 39;]);

$ site_list=阵列(& # 39;www # 39;=比;& # 39;/mnt/webroot/测试/& # 39;);

$ orig_dir=目录名(__FILE__);如果(
!array_key_exists(网站,site_list美元)){
,,,头(& # 39;HTTP/1.1 400坏请求# 39;);
,,,退出();
}

if($模式比;3 | | $模式& lt;0){
,,,头(& # 39;HTTP/1.1 400坏请求# 39;);
,,,退出();
}

orig_file=site_list美元(美元的网站)。美元路径;如果(
!file_exists (orig_file美元)){
,,,头(& # 39;HTTP/1.1 404 Not发现# 39;);
,,,退出();
}

$ file_ext=& # 39;强生# 39;。pathinfo($路径,PATHINFO_EXTENSION);

$ file_name=basename(路径,file_ext美元);
$ save_path=皗$ orig_dir}/{$网站}/{$宽度}x{$高度}-{$模式}/{$ path}“;
$ save_dir=目录名($ save_path);

如果!file_exists ($ save_dir)
,,,wpx_mkdir ($ save_dir);

target_width=美元宽度;
target_height=美元高度;

new_width=target_width美元;
new_height=target_height美元;
图像=new Imagick美元($ orig_file);
列表(orig_width, orig_height美元、美元类型attr)美元=getimagesize ($ orig_file);

if($模式==?“){
,,,//等比缩放图像
,,,new_height=orig_height * new_width美元/美元orig_width;
,,,如果($ new_height祝辞target_height美元){
,,,,,,,new_width=orig_width * target_height美元/美元orig_height;
,,,,,,,new_height=target_height美元;
,,,}
} else if($模式==?“){
,,,//放大并裁剪图像
,,,美元desired_aspect=target_width/target_height美元;
,,,美元orig_aspect=orig_width/orig_height美元;

,,,如果($ desired_aspect祝辞orig_aspect美元){
,,,,,,,修剪=orig_height——美元(orig_width/desired_aspect美元);
,,,,,,,形象→美元cropImage ($ orig_width orig_height -削减美元0,削减美元/2);
,,,,,,,error_log(“高度修剪trim"美元);
,,,其他}{
,,,,,,,修剪=orig_width——美元(orig_height * desired_aspect美元);
,,,,,,,形象→美元cropImage (orig_width -削减美元,美元orig_height,修剪/2美元,0),
,,,}
}

图像→美元resizeImage (new_width, new_height美元,imagick:: FILTER_LANCZOS, 1),
图像→美元writeImage ($ save_path);
头(& # 39;- type:图像/jpeg # 39;);
头(& # 39;last - modified: & # 39;。函数(& # 39;D, D M Y H:我:& # 39;)。& # 39;格林尼治时间# 39;);
回声file_get_contents ($ save_path);
返回true;

//循环生成目录
函数wpx_mkdir (dir,模式=0777美元){
,,,如果(is_dir (dir美元)| | @mkdir (dir,模式)美元)
,,,,,,,返回true;
,,,如果(!wpx_mkdir(目录名(dir)美元,美元模式))
,,,,,,,返回false;
,,,返回@mkdir (dir,美元模式),
}

三,nginx。参看配置

代码如下:


服务器{
,,,,,,,listen ,,,,,80;
,,,,,,,server_name test.yourdomain.com;
,,,,,,,root ,/mnt/webroot/测试;
,,,,,,,index index . php,
,,,,,,,到期后30 d;

,,,,,,,位置/s {
,,,,,,,,,,#只有当没有生成这张图片时才调用动态裁剪
,,,,,,,,,,如果(!null

怎么在PHP中利用Nginx实现一个动态裁剪图片功能