故事背景:
為了讓物理像素密度更高的iphone6s等手機(jī)享受高清圖片定制(同時(shí)普通手機(jī)對(duì)圖片的質(zhì)量可以降低),我們需要一個(gè)圖片服務(wù)器來(lái)實(shí)現(xiàn)以下的功能:
<blockquote>
我想,做的好的公司,都會(huì)有這么一個(gè)圖片服務(wù)器,通過(guò)url獲取參數(shù),然后可以控制圖片質(zhì)量,也可以將圖片裁剪成不同的尺寸。
所以我們只需上傳大圖(@2x),其余小圖都交給圖片服務(wù)器處理,我們只要負(fù)責(zé)拼接url即可。
</blockquote>
如,這樣一張?jiān)瓐D:
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX.jpg
可以類(lèi)似這樣,進(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幫你對(duì)圖片進(jìn)行處理,包括裁減啊縮放啊這樣的功能。返回一張?zhí)幚磉^(guò)的圖片。
這里跳過(guò)編譯的步驟(我的nginx是由運(yùn)維搭建的編譯進(jìn)去了這個(gè)模塊),高版本的nginx可以動(dòng)態(tài)加載該模塊。
下面開(kā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寫(xiě)法請(qǐng)參考這里。
以上寫(xiě)法本身參考自這里。
需要強(qiáng)調(diào)的是其中判斷文件是否存在與rewrite讓我寫(xiě)了好半天,希望你可以深入理解跳過(guò)這個(gè)坑。
另外畢竟是cpu幫我們生成了新圖,并沒(méi)有將它保存下來(lái)。所以訪問(wèn)量大的時(shí)候是一種消耗。有文章介紹結(jié)合Fastdfs一起可以解決這個(gè)問(wèn)題。