接着上一篇項目實戰之中小網站數據緩存的設計與實現 ,我們繼續討論在鄰水項目中其他對於中小網站要用到的技術。
由於我們的項目服務器空間有限,如果每次上傳圖片都大於1M那上傳幾張圖片,空間就滿了,而且訪問速度也慢。我們採取圖片壓縮技術,在首頁展示的時候進行深壓縮處理,對文章裏面的圖片進行淺壓縮處理。
我們文件上傳統一是由SystemFileService處理,當爲圖片時,執行uploadImg(...)方法。
其核心代碼如下
public SystemFile uploadImg(FileTransfer fileTransfer ,String createrId){
String filePath = null;
String mimeType = null;
try {
mimeType = fileTransfer.getMimeType();
mimeType = mimeType == null ? "" : mimeType.toUpperCase();
if(mimeType.indexOf("IMAGE") < 0){//不是圖片文件
return null;
}
filePath = FileUtil.saveImg(fileTransfer.getInputStream(),400);
...
}
當判斷是一個圖片時,調用FileUtil的靜態方法,saveImg,傳入的參數有兩個,第一個是圖片流,第二個是寬或高的最大長度,核心代碼如下:
BufferedImage bi = ImageIO.read(inputStream);//讀取圖片流
double ratio = 1.0;//壓縮比例
int w = bi.getWidth();//上傳圖片的寬度
int h = bi.getHeight();//上傳圖片的高度
ratio = (w > h ? w : h)/*長或寬,取最長那個。*/ > limit/*如果最長的大於限制長度*/ ? (limit/(w > h ? w : h))/*true 算出壓縮比例*/ : ratio/*false 不壓縮*/;//
int newW = (int)Math.floor(w * ratio),newH = (int)Math.floor(h * ratio);//算出壓縮後的長寬
BufferedImage tag = new BufferedImage(newW,newH,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();//畫圖
g.drawImage(bi.getScaledInstance(newW, newH, BufferedImage.SCALE_SMOOTH), 0, 0,null);//getScaledInstance 將圖片放大或者縮小 BufferedImage.SCALE_SMOOTH 平滑一點,圖片質量好點,但是效率要慢一點。
g.dispose();//釋放資源。
ImageIO.write(tag, "JPEG",file);//畫好了之後 寫到文件file裏面數據格式爲 JPEG
每一句話後面都加了註釋,相信讀者可以看懂,這樣,在上傳顯示圖片的時候大小就傳爲400,傳文章內容的時候圖片大小就傳爲100,這樣就實現了圖片壓縮。