1,目的

为了节省用户下载图片的流量,我们可以在适当的地方使用图片缩略图技术。

2,使用方式

原始图片url

http://xx.xx.xx.xx/xx/xx/abc.jpg

缩略图片url

http://xx.xx.xx.xx/xx/xx/abc.jpg!wxh[.jpg|.png]

最后面的.png|.jpg可选

如果希望width/height按比例缩放,设置为 -

1),限制图片返回的宽度最大为200

http://xx.xx.xx.xx/xx/xx/abc.jpg!200x-

2),限制图片返回的高度最大为200

http://xx.xx.xx.xx/xx/xx/abc.jpg!-x200

3),限制图片返回宽度不超过200,高度不超过300

http://xx.xx.xx.xx/xx/xx/abc.jpg!200x300

3,Nginx + Linux 缩略图实现

3.1,原理

利用nginx image filter模块实时压缩图片

1),当访问的缩略图不存在,则根据原始图片实时生成对应尺寸的缩略图片,并把缩略图保存到磁盘。(图片缩放时会消耗部分CPU计算)

2),如果缩略图已经存在,则直接返回磁盘上的缩略图。

特点:支持缩略图写磁盘,不支持水印。

依赖于gd:

# yum install -y gd-devel

3.2,nginx配置实现

nginx-tomcat.conf
location ~ ^/Mobile/jiefang/* {
    root /home/wwwroot/ftp;
    set $width "-";
    set $height "-";
    if ( $uri ~ "/(.{1,}\..+)!([\d|-]+)x([\d|-]+).*" ) {
        set $width  $2;
        set $height $3;
        set $image_path $1;
    }
    set $image_uri thumb_image/$image_path?width=$width&height=$height;
    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1/$image_uri;
        break;
    }
    proxy_store          on; #/home/wwwroot/ftp/$request_filename;  #on表示压缩后的文件保存在与源图片相同目录下。
    proxy_store_access   user:rw  group:rw  all:r;
    #proxy_temp_path      /tmp/images;
    proxy_set_header     Host $host;
    proxy_set_header     Content-Type image/jpeg;
}
location /thumb_image {
    alias /home/wwwroot/ftp;
    image_filter resize $arg_width $arg_height;
    image_filter_jpeg_quality 75;                                   # 压缩质量
    #image_filter_buffer 2m;                                        # 如果原始图片大小起过1m,则会报415错误
    if ( $request_filename ~ "/home/wwwroot/ftp/(.*)" ) {
        error_page 415 = http://$host/$1;                           # 如果出错,则使用原始图片
    }
    allow 127.0.0.0/8;
    deny all;
}

3.3,例子

例子:

http://192.168.85.197/Mobile/jiefang/server/prod/upload/01.jpg                    原图: 805k

http://192.168.85.197/Mobile/jiefang/server/prod/upload/01.jpg!200x-          17k

http://192.168.85.197/Mobile/jiefang/server/prod/upload/02.png                   原图: 698k

http://192.168.85.197/Mobile/jiefang/server/prod/upload/02.png!200x200    79k

http://192.168.85.197/Mobile/jiefang/server/prod/upload/03.jpg                    原图: 300k

http://192.168.85.197/Mobile/jiefang/server/prod/upload/03.jpg!300x-          15k

4,Apache + Windows缩略图实现

4.1,环境

Windows + Apache + PHP + ImageMagick

ImageMagick是一款免费+多平台+性能强劲的图片处理库,处理图片时占用内存低,图片清晰效果好。

4.2,原理

同上3.1,但支持水印

4.3,Apache配置

httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so                                               #开户Apache重写规则模块
LoadModule fcgid_module modules/mod_fcgid.so                                                   #使用fastcgi代理PHP请求
<IfModule mod_fcgid.c>                                                                         #配置php环境
    AddHandler fcgid-script .fcgi .php
    FcgidInitialEnv PHPRC "d:/software/php-5.2.17"
    FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
    FcgidMaxRequestsPerProcess 1000
    FcgidMaxProcesses 5
    FcgidIOTimeout 120
    FcgidIdleTimeout 120
    FcgidWrapper "d:/software/php-5.2.17/php-cgi.exe" .php
    AddType application/x-httpd-php .php
</IfModule>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/Mobile/(.+\.(jpg|jpeg|png)![-|\d]+x[-|\d]+).*$ /php/resize.php?file=$1 [L]       #如果client请求图片并且要求对图片缩放,则将请求及参数重写至resize.php

4.4,PHP配置

php.ini
extension=php_imagick.dll                                                                      #加载ImageMagick图片处理模块

4.5,resize.php

resize.php
$w = preg_match('/^\d+$/i'$w) ? intval($w) : 0;
$h = preg_match('/^\d+$/i'$h) ? intval($h) : 0;
if (file_exists($path) == false){ // 如果缩略图不存在,则创建它
    $image new Imagick($srcPath);
    $len $image->getImageSize();
    if($len < 1024 * 50){         // 如果原图小于50k,则不缩放
        $path $srcPath;
    }
    else{
        $real_w $image->getImageWidth();
        $real_h $image->getImageHeight();
        // 以下4行代码可以提升性能
        $image->setImageCompression(Imagick::COMPRESSION_JPEG);
        $image->setImageCompressionQuality(75); // 设置图片质量
        $image->stripImage();
        $image->setImageFormat('JPEG');
        $image->thumbnailImage($w$h);
        $image->writeImages($path, true);
    }
    $image->clear();
    $image->destroy();
}
echo file_get_contents($path);

4.6,例子

我的机器

http://192.168.85.197/Mobile/server/upload/test1.jpg                原图:563k

http://192.168.85.197/Mobile/server/upload/test1.jpg!100x-      8.9k

http://192.168.85.197/Mobile/server/upload/test3.jpg                原图:779k

http://192.168.85.197/Mobile/server/upload/test3.jpg!100x-      8.3k

http://192.168.85.197/Mobile/server/upload/test4.jpg                原图:3.9k

http://192.168.85.197/Mobile/server/upload/test4.jpg!100x-      3.9k (图片小于50k时未缩放,返回原图)

http://192.168.85.197/Mobile/server/upload/test5.png              原图:8.73M

http://192.168.85.197/Mobile/server/upload/test5.png!200x-    8.7k

5,参考资料

 

Nginx/Apache图片缩略图技术的更多相关文章

  1. NodeJs + gm图片缩略图

    我的另一篇文章: Nginx/Apache图片缩略图技术 gm官网 1, 软件环境 nodejs npm GraphicsMagick or ImageMagick 貌似ImageMagick在处理大 ...

  2. Nginx Image Module图片缩略图 水印处理模块

    Nginx Image Module图片缩略图 水印处理模块 下载Tengine tar -zxvf tengine-1.4.5.tar.gz cd tengine-1.4.5 下载Nginx tar ...

  3. [转帖]Nginx Image Module图片缩略图 水印处理模块

    Nginx Image Module图片缩略图 水印处理模块 https://www.cnblogs.com/jicki/p/5546972.html Nginx Image Module图片缩略图 ...

  4. Nginx 搭建图片服务器

    Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器.在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd. Nginx 安装:http://www ...

  5. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

  6. Nginx,Nginx 搭建图片服务器

    Nginx Nginx 概述 反向代理 工作流程 优点 1:保护了真实的web服务器,保证了web服务器的资源安全 2:节约了有限的IP地址资源 3:减少WEB服务器压力,提高响应速度 4:其他优点 ...

  7. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)

    在 nginx 中,proxy 用来实现反向代理,upstream 用来实现负载均衡. 例如有两台服务器,nginx 服务器作为代理服务器,执行 .html 文件,apache 服务器上执行 .php ...

  8. 转:Nginx+Apache环境的安装与配置

    转:http://www.server110.com/nginx/201404/8817.html 我们依然尽可能采用yum来安装我们需要的软件,由系统官方维护的软件,其安全性和稳定性都值得信赖,并且 ...

  9. nginx配置图片服务器

    这几天研究了一下nginx配置图片服务器的相关内容,个人的一些收获与大家分享一下: Nginx是目前非常流行的web服务器,它起源于俄罗斯.它具有处理速度快,并发量大,占用资源极低等优点,尤其对于静态 ...

随机推荐

  1. LinuxShell_variable+if+while

    [root@ossec-server mybash]# vim ./hello.sh #! /bin/sh # This is a example bash script echo "Hel ...

  2. plsql 书写命名规范

    俗话说事不预则废,无规矩不成方圆. 对sql脚本程序的设计,个人认为应该是从编码规范开始. 前段时间公司一些同事提交的脚本,风格迥异,让我审核起来倍感难受,丝毫没有审核代码的快感. 特整理了公司部分常 ...

  3. 手势识别官方教程(3)识别移动手势(识别速度用VelocityTracker)

    moving手势在onTouchEvent()或onTouch()中就可识别,编程时主要是识别积云的速度用VelocityTracker等, Tracking Movement This lesson ...

  4. html5学习链接

    http://www.runoob.com/tags/html-colorpicker.html

  5. 【HDOJ】3337 Guess the number

    神一样的题目.简言之,利用手段获得测试用例的第一行,输出结果.很显然利用wa, TLE, OLE等judge status可以获得测试用例.因此,果断Python写一个acm提交机器人.依赖lxml库 ...

  6. Oracle系列之权限

    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等 赋予权限:前三个要在管理员权限用户下进行操作 方法1: grant dba to db_user;--赋予用户数据库管理权限 方法2: ...

  7. hdu4499Cannon(搜索)

    链接 这样的叫迭代吗..最近多做些搜索题了要 分行分列搜 判断满足条件 #include <iostream> #include<cstdio> #include<cst ...

  8. $apply() $digest()

    理解Angular中的$apply()以及$digest() <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  9. 【 D3.js 选择集与数据详解 — 2 】 使用data()绑定数据

    D3 中绑定数据大多是由 data() 函数来完成的,它是怎样工作的,它与 datum() 有什么区别呢? data()函数能够将数组各项分别绑定到各元素上,而且能够设置绑定的规则.data()还能够 ...

  10. c语言字符类别测试库函数#include<ctype.h>

    字符类测试<ctype.h> 头文件<ctype.h>中说明了一些用于测试字符的函数.每个函数的变量均为int类型,变量的值必须是EOF或可用unsigned char类型表示 ...