爲了節省用戶下載圖片的流量,咱們能夠在適當的地方使用圖片縮略圖技術。php
原始圖片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
利用nginx image filter模塊實時壓縮圖片
1),當訪問的縮略圖不存在,則根據原始圖片實時生成對應尺寸的縮略圖片,並把縮略圖保存到磁盤。(圖片縮放時會消耗部分CPU計算)
2),若是縮略圖已經存在,則直接返回磁盤上的縮略圖。
特色:支持縮略圖寫磁盤,不支持水印。
依賴於gd:
# yum install -y gd-devel
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;
}
|
例子:
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
Windows + Apache + PHP + ImageMagick
ImageMagick是一款免費+多平臺+性能強勁的圖片處理庫,處理圖片時佔用內存低,圖片清晰效果好。
同上3.1,但支持水印
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
|
extension=php_imagick.dll
#加載ImageMagick圖片處理模塊
|
$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
);
|
個人機器
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