項目實戰之中小網站圖片壓縮技術

接着上一篇項目實戰之中小網站數據緩存的設計與實現 ,我們繼續討論在鄰水項目中其他對於中小網站要用到的技術。

 

由於我們的項目服務器空間有限,如果每次上傳圖片都大於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,這樣就實現了圖片壓縮。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章