您的位置:首页 > 运维架构 > Nginx

nginx+GraphicsMagick实现缩略图、图片实时缩放

2016-07-05 14:54 766 查看

GraphicsMagick

1.介绍

GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。

2.安装

GraphicsMagick有windows的安装包,直接双击运行,下一步下一步即可,linux平台不做过多赘述,如果不会安装请百度

注意:安装成功之后 记得加入环境变量中

3.常用命令

只缩小不放大
```
gm convert input.jpg -resize "500x500>" output_1.jpg
```
加了>,表示只有当图片的宽与高,大于给定的宽与高时,才进行“缩小”操作。
生成的图片大小是:160x120,未进行操作
如果不加>,会导致图片被比等放大。

等比缩图  (缺点:产生白边)
```
gm convert input.jpg -thumbnail "100x100" output_1.jpg
```
生成的图片大小是:100x75

非等比缩图,按给定的参数缩图(缺点:长宽比会变化)
```
gm convert input.jpg -thumbnail "100x100!" output_2.jpg
```
生成的图片大小是:100x100

裁剪后保证等比缩图 (缺点:裁剪了图片的一部分)
```
gm convert input.jpg -thumbnail "100x100^" -gravity center -extent 100x100 output_3.jpg
```
生成的图片大小是:100x100,还保证了比例。不过图片经过了裁剪,剪了图片左右两边才达到1:1

填充后保证等比缩图 (缺点:要填充颜色,和第一种方法基本一样)
```
gm convert input.jpg -thumbnail "100x100" -background gray -gravity center -extent 100x100 output_4.jpg
```
生成的图片大小是:100x100,还保证了比例,同时没有对图片进行任何裁剪,缺失的部分按指定颜色进行填充。

需要的命令就这么多 ,gm还有很多其它强大的功能,如水印,图片格式转换等等,需要深入了解的朋友可自行查看文档


Nginx

1.安装

linux 安装请查看我的文章 http://blog.csdn.net/daerduotutuzi/article/details/51042388

2.配置

主要介绍的是配置

server {
listen       6789;
server_name   img.app;
root   "D:/phpStudy/WWW/img";
location ~ \.(png|jpg|jpeg|gif)$ {
set $thumbnail_root D:/phpStudy/WWW/img/thumbnail;
set $file $thumbnail_root$uri;
if (-f $file) {
rewrite ^/(.*)$ /thumbnail/$1 last;
}
#如果文件不存在,则rewrite到产生图片的脚本文件autoimg.php
if (!-f $request_filename) {

rewrite ^/.*$ /autoimg.php;
expires max;
}
#如果文件存在,则设置过期时间,关闭访问日志
if ( -f $request_filename ) {
expires max;
access_log off;
}
}
location / {
index  index.html index.htm index.php;
#autoindex  on;
}
location ~ autoimg.php$ {#安全性考虑,文件服务器,只这个脚本文件的范围提交给php处理
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}
location ~ \.php(.*)$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_param  PATH_INFO  $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
include        fastcgi_params;
}
}


需要用到的php文件(当然其它语言也是可以的,无非就是获取了url参数,执行了一段系统命令)

<?php
$file = $_SERVER ['REQUEST_URI'];//请求字串 /abc.jpg.w320.jpg
$srcFile = $_SERVER ['DOCUMENT_ROOT'] .$file;
$desfile = $_SERVER ['DOCUMENT_ROOT'] . '/thumbnail'.$file; //目标目标路径
$dirname = dirname ( $srcFile ) . "/";
$filename = basename ( $desfile );
if (preg_match ( "/([^\.]+\.(png|jpg|jpeg|gif))\.w([\d]+)\.(jpg)/i", $filename, $m )) {
$srcfile = $dirname . $m [1];
$width = $m [3];                    //匹配出输出文件宽度

createThumbnail ( $srcfile, $desfile, $width );
}

function createThumbnail($src,$des,$width){
$dir = dirname($des);
if(!is_dir($dir)){
makeDir($dir);
}
$imageinfos = getimagesize ( $src );
$height = intval($width / $imageinfos[0] *  $imageinfos[1]);
$wh = $width.'x'.$height;
$str = "D:\GraphicsMagick-1.3.24-Q8\gm.exe convert " .$src. " -thumbnail  ".$wh."  -background gray -gravity center -extent  ".$wh."  ".$des.' 2>&1';
exec($str,$out,$status);
if($status == 0){
header('Content-type: image/jpg');
$data = file_get_contents($des);
echo $data;
}
}

function makeDir($path){
if(is_dir($path)){//已经是目录了就不用创建
return true;
}
if(is_dir(dirname($path))){//父目录已经存在,直接创建
return mkdir($path);
}
makedir(dirname($path));//创建各级父目录

return mkdir($path);//因为有父目录,所以可以创建路径
}

原图放入网站目录中 访问 http://img.app/abc.jpg.w320.jpg 就可以看到thumbnail生成了一个宽度为320px的缩略图文件,而浏览器中的图片大小确实为320px
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像处理 nginx php