故事背景:
為了讓物理像素密度更高的iphone6s等手機(jī)享受高清圖片定制(同時普通手機(jī)對圖片的質(zhì)量可以降低)摹量,我們需要一個圖片服務(wù)器來實(shí)現(xiàn)以下的功能:
<blockquote>
我想牵囤,做的好的公司飒房,都會有這么一個圖片服務(wù)器雾鬼,通過url獲取參數(shù)膀藐,然后可以控制圖片質(zhì)量屠阻,也可以將圖片裁剪成不同的尺寸。
所以我們只需上傳大圖(@2x)额各,其余小圖都交給圖片服務(wù)器處理国觉,我們只要負(fù)責(zé)拼接url即可。
</blockquote>
如虾啦,這樣一張原圖:
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX.jpg
可以類似這樣麻诀,進(jìn)行圖片裁剪:
200×200
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX_200x200.jpg
100×100
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX_100x100.jpg
查閱之后發(fā)現(xiàn)nginx本身可以搞定。
http_image_filter的作用就是在路由這一步傲醉,由nginx幫你對圖片進(jìn)行處理蝇闭,包括裁減啊縮放啊這樣的功能。返回一張?zhí)幚磉^的圖片硬毕。
這里跳過編譯的步驟(我的nginx是由運(yùn)維搭建的編譯進(jìn)去了這個模塊)呻引,高版本的nginx可以動態(tài)加載該模塊。
下面開始粘貼nginx中的相關(guān)配置:
location ~ \/testImage\/(\d+)\.(jpg)$ {
set $h $arg_h;
set $w $arg_w;
#image_filter crop $h $w;
image_filter resize $h $w;
}
location ~ \/testImage\/(\d+)_(\d+)x(\d+)\.(jpg)$ {
if ( -e $document_root/testFile/testImage/$1.$4 ) {
rewrite '/(\d+)_(\d+)x(\d+)\.(jpg)$' /testFile/testImage/$1.$4?h=$2&w=$3 last;
}
return 404;
}
location ~* \.(jpg)$ {
}
location的匹配規(guī)則和rewrite寫法請參考這里昭殉。
以上寫法本身參考自這里苞七。
需要強(qiáng)調(diào)的是其中判斷文件是否存在與rewrite讓我寫了好半天藐守,希望你可以深入理解跳過這個坑挪丢。
另外畢竟是cpu幫我們生成了新圖,并沒有將它保存下來卢厂。所以訪問量大的時候是一種消耗。有文章介紹結(jié)合Fastdfs一起可以解決這個問題慎恒。