<?php
/**
* 图像裁剪
* 需要系统安装 php-imagick 扩展
*/
//ini_set ( "memory_limit", "80M" );
// 请求地址比如 http://xxx.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png
// nginx重写规则 rewrite /s/(.*)/(\d+)x(\d+)-(\d)/(.*) /s/resize.php?site=$1&width=$2&height=$3&mode=$4&path=$5 last;
// 测试 http://localhost/resize.php?site=imgs&width=300&height=300&mode=1&path=22.jpg
// 图片放在resize.php同级的 ./imgs/ 目录下 访问后会创建 ./cache/ 文件夹
// 后期可以考虑
$path = trim ( $_GET ['path'] );
$mode = intval ( $_GET ['mode'] );
$site = trim ( $_GET ['site'] );
$width = intval ( $_GET ['width'] );
$height = intval ( $_GET ['height'] );
//访问文件是否存在
$now_dir = dirname ( __FILE__ );
//缩略图路径(***路径名cache可选修改***)
$zip_dir = "{$now_dir}/cache/{$site}/{$width}x{$height}-{$mode}/";
//原始图片存放目录
$img_dir = "{$now_dir}/{$site}/";
//原始图片文件完整路径
$big_file = "{$img_dir}{$path}";
//缩略图文件完整路径
$save_path = "{$zip_dir}{$path}";
//缩略图存在直接返回,不存在去检测原图
if (file_exists ( $save_path )){
header ( 'Content-Type: image/jpeg' );
//header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );
//读取文件的修改时间
header ('Modified:'.gmdate("D, d M Y H:i:s",filemtime($save_path)).' GMT');
//输出图片流
echo file_get_contents ( $save_path );
return true;
}else if(! file_exists($big_file)){
header ( 'HTTP/1.1 404 Not Found' );
exit ();
}
//检测并创建保存目录
if (! file_exists ( $zip_dir )){
//wpx_mkdir ( $zip_dir );
createDir($zip_dir);
}
$target_width = $width;
$target_height = $height;
$new_width = $target_width;
$new_height = $target_height;
$image = new Imagick ( $big_file );
list ( $orig_width, $orig_height, $type, $attr ) = getimagesize ( $big_file );
if ($mode == "0") {
//等比缩放图像
$new_height = $orig_height * $new_width / $orig_width;
if ($new_height > $target_height) {
$new_width = $orig_width * $target_height / $orig_height;
$new_height = $target_height;
}
} else if ($mode == "2") {
// 放大并裁剪图像
$desired_aspect = $target_width / $target_height;
$orig_aspect = $orig_width / $orig_height;
if ($desired_aspect > $orig_aspect) {
$trim = $orig_height - ($orig_width / $desired_aspect);
$image->cropImage ( $orig_width, $orig_height - $trim, 0, $trim / 2 );
error_log ( "HEIGHT TRIM $trim" );
} else {
$trim = $orig_width - ($orig_height * $desired_aspect);
$image->cropImage ( $orig_width - $trim, $orig_height, $trim / 2, 0 );
}
}
// 处理图片
$image->resizeImage ( $new_width, $new_height, imagick::FILTER_LANCZOS, 1 );
// 保存处理后的图片
$image->writeImage ( $save_path );
//标记返回头信息
header ( 'Content-Type: image/jpeg' );
header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );
echo file_get_contents ( $save_path );
return true;
// 循环生成目录(不使用)
function wpx_mkdir($dir, $mode = 0777) {
if (is_dir ( $dir ) || @mkdir ( $dir, $mode ))
return true;
if (! wpx_mkdir ( dirname ( $dir ), $mode ))
return false;
return @mkdir ( $dir, $mode );
}
//生成目录
function createDir($path){
if (!file_exists($path)){
createDir(dirname($path));
mkdir($path, 0777) or die('create dir fail, NND');
}
}
?>
大搬运并修改,原地址
https://www.markdream.com/technologies/programs/how-to-build-a-resizing-image-server-with-imagick.shtml
分享到:
相关推荐
本主题将详细介绍如何利用FastDFS和Nginx搭建一个分布式图片存储系统,并实现动态生成缩略图的功能。 首先,我们来看FastDFS。FastDFS设计的主要目标是为互联网应用提供高效的文件存储服务,它将文件存储与文件访问...
Docker+FastDFS+Nginx+Lua实现图片缩略图1、FastDFS安装1.1、镜像下载1.2、开启tracker容器1.3、开启storage容器1.4、测试2、FastDFS集成Nginx+lua2.1、依赖包下载2.2、安装软件基础包2.3、依赖安装2.4、配置Lua脚本...
Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片
keepalived+nginx实现双主热备
SpringBoot+VUE+Redis+nginx 网上拍卖平台源码 SpringBoot+VUE+Redis+nginx 网上拍卖平台源码 SpringBoot+VUE+Redis+nginx 网上拍卖平台源码 SpringBoot+VUE+Redis+nginx 网上拍卖平台源码 SpringBoot+...
在Windows环境下搭建PHP和Nginx的组合是一个常见的任务,特别是在本地开发环境中。这个配置能够提供一个高效且灵活的Web服务器平台,支持动态内容处理,如PHP脚本。以下是对"windows下 php+nginx配置详解"的详细说明...
ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台。 使用说明(ffmpeg+nginx+rtmp-module已经整合,支持HTTP,具体配置查看conf/nginx.conf): 1.解压后,运行nginx_start.bat。(查看监控状态 ...
大型电商项目实战1:Redis+Rest+Linux+Nginx+Spring+SpringMVC实现JAVA高并发秒杀系统,baidu链接,谢谢
### Keepalived+Nginx 实现高可用Web负载均衡 #### 场景需求 在现代互联网应用中,网站和应用程序需要处理大量的用户请求,并确保即使在服务器出现故障的情况下也能持续提供服务。为了满足这一需求,通常采用高可用...
【标题】:Tomcat+memcached+Nginx实现session共享 【内容详解】: Tomcat、Nginx和memcached的组合是常见的Web服务器架构,其中session共享是解决多服务器间用户状态同步的关键问题。本方案主要通过MSM(Memcached...
【Consul+upsync+Nginx动态配置负载均衡】 Consul+upsync+Nginx的组合提供了一种高效且灵活的动态负载均衡解决方案,它允许Nginx在无需重启的情况下实时更新其配置,以响应后端服务器的变化。这种技术特别适用于高...
FFmpeg+nginx+rtmp搭建环境实现推流 FFmpeg、nginx、rtmp三者结合可以实现一个强大且高效的流媒体服务器,下面是它们的详细介绍和搭建过程。 FFmpeg FFmpeg是一款功能强大的开源命令行工具,能够处理视频和音频...
"Linux+Nginx+PHP+MySQL环境配置指南" 本指南将指导您如何安装和配置 Linux+Nginx+PHP+MySQL 环境,以便于构建一个功能完善的 Web 服务器。 安装 Red Hat Linux 在开始安装 Linux 之前,需要选择语言和键盘布局。...
【标题】:“Haproxy+Keepalived+Nginx+Lamp+Nfs实现高可用集群1” 【描述】:“在互联网服务中,高可用性是关键。本案例将通过Haproxy、Keepalived、Nginx、LAMP(Linux、Apache、MySQL、PHP)和NFS(网络文件系统...
Keepalived + Nginx 实现高可用 Web 负载均衡配置文件,具体详情参见博文:http://blog.csdn.net/l1028386804/article/details/72801492
本教程将围绕"OBS+NGINX实现rtmp直播推流"这一主题展开,详细介绍如何利用开源软件Open Broadcasting Software (OBS) 和 Nginx 搭建一个rtmp直播推流系统,并使用VLC作为播放器。 首先,OBS是一款强大的免费开源...
Spring Boot+Nginx 实现负载均衡 在本文中,我们将介绍如何使用 Spring Boot 和 Nginx 实现负载均衡。负载均衡是指将 Incoming requests 分配到多个服务器,以提高系统的可扩展性和可靠性。使用 Spring Boot 和 ...
Keepalived+nginx 实现双机主备 Keepalived 是一个基于 VRRP 协议的高可用性解决方案,可以与 Nginx 服务器集成,以实现双机主备的高可用性架构。在本文中,我们将详细介绍使用 Keepalived 和 Nginx 实现双机主备的...