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

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参数,执行了一段系统命令)


    $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

你可能感兴趣的:(个人收藏,服务器)