Nginx/Apache圖片縮略圖技術

1,目的

爲了節省用戶下載圖片的流量,咱們能夠在適當的地方使用圖片縮略圖技術。php

2,使用方式

原始圖片urlhtml

http://xx.xx.xx.xx/xx/xx/abc.jpgnginx

 

縮略圖片urlgit

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

最後面的.png|.jpg可選tomcat

若是但願width/height按比例縮放,設置爲 -bash

 

1),限制圖片返回的寬度最大爲200app

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

 

2),限制圖片返回的高度最大爲200url

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,參考資料

相關文章
相關標籤/搜索