1. 程式人生 > >專案實戰之中小網站圖片壓縮技術

專案實戰之中小網站圖片壓縮技術

接著上一篇專案實戰之中小網站資料快取的設計與實現 ,我們繼續討論在鄰水專案中其他對於中小網站要用到的技術。

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

相關推薦

專案實戰中小網站圖片壓縮技術

接著上一篇專案實戰之中小網站資料快取的設計與實現 ,我們繼續討論在鄰水專案中其他對於中小網站要用到的技術。 由於我們的專案伺服器空間有限,如果每次上傳圖片都大於1M那上傳幾張圖片,空間就滿了,而且訪問速度也慢。我們採取圖片壓縮技術,在首頁展示的時候進行深壓縮處理,對文章裡

安卓專案實戰Glide 3高手養成(二):Glide強大的圖片變換功能

使用Glide時普遍會遇到的一個問題,如何解決? 首先我們嘗試使用Glide來載入一張圖片,圖片URL地址是:https://www.baidu.com/img/bd_logo1.png 這是百度首頁logo的一張圖片,圖片尺寸是540*258畫素。 接下來我們編寫一個非常簡單的佈局檔案

安卓專案實戰與UI那點事:圖片適配你必須要了解的知識點

1,mipmap和drawable的區別 在Android4.2以上的版本中,提供了對mipmaps的支援,如果你用Andorid Studio開發Android程式會發現Android Studio自動幫你建立了幾個mipmaps資料夾,很多人每次新建一個工程的時候,總是先把mipma

安卓專案實戰Gif圖片載入的最佳實踐android-gif-drawable開源庫的使用

前言 在平時的專案開發中,我們或多或少會遇到載入gif圖片這樣的需求,但是Android的ImageView又無法直接載入Gif圖片,面對這樣的需求我們一般都會想到使用支援載入gif動圖的Glide第三方庫來進行實現,但是使用過程中發現Glide在載入大的gif

重磅迴歸-SSM整合進階專案實戰個人部落格系統

    歷經一個多月的重新設計,需求分析以及前後端開發,終於有了一定的輸出:我自己實現的spring4+springmvc+mybatis3整合的進階專案實戰-個人部落格系統 已然完成了,系統採用mvc三層模式進行整體的開發,涉及到技術一下子很難全部列出,其中不得不提的有:整

安卓專案實戰關於獲取SD卡指定路徑和檔案的講解

前言 當我們將手機連線到電腦上時,我們發現在SD卡的根目錄下生成了成百上千的由各種應用程式建立的資料夾,導致我們也不知道哪個資料夾是用來幹嘛的,這正因為這樣安卓開發人員經常受到使用者的吐槽。 的確作為一個安卓開發者,我們的確不應該將我們應用的資料直接存到SD卡的根目錄下,這樣當手機安

安卓專案實戰Activity啟動過程中動態獲取元件寬高的3種方式

前言 有時候我們需要在Activity啟動的時候獲取某一元件的寬或者是高用於動態的更改UI佈局,但是這時候我們直接通過getWidth和getHeight方法獲取是有問題的,如下: 我們在Activity的onCreate方法中呼叫如下的方法來獲取元件的寬高: /** * 在onC

安卓專案實戰設定Activity跳轉動畫的5種實現方式

前言 在介紹activity的切換動畫之前我們先來說明一下實現切換activity的兩種方式: 1,呼叫startActivity方法啟動一個新的Activity並跳轉其頁面 2,呼叫finish方法銷燬當前的Activity返回上一個Activity介面 當呼叫startActiv

安卓專案實戰如何debug執行具有release簽名的apk

需求分析 眾所周知,Android的安裝包有測試包(debug版本)和正式包(release版本)之分,一般我們測試時安裝的debug版本預設採用的簽名都是系統幫我們提供的debug.keystore簽名檔案,該檔案位於C:\Users\Administrator.android目錄

安卓專案實戰強大的網路請求框架okGo使用詳解(六):擴充套件專案okServer,更強大的下載上傳功能,支援斷點和多工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

安卓專案實戰強大的網路請求框架okGo使用詳解(五):擴充套件專案okRx,完美結合RxJava

前言 在第一篇講解okGo框架新增依賴支援時,還記得我們額外新增的兩個依賴嗎,一個okRx和一個okServer,這兩個均是基於okGo框架的擴充套件專案,其中okRx可以使請求結合RxJava一起使用,而okServer則提供了強大的下載上傳功能,如斷點支援,多工管理等,本篇我們主要講

安卓專案實戰強大的網路請求框架okGo使用詳解(四):Cookie的管理

Cookie概念相關 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制是需要藉助於cookie機制來達到儲存標識的目的,所謂ses

安卓專案實戰強大的網路請求框架okGo使用詳解(三):快取的使用

相關實體類必須實現序列化介面 使用快取前,必須讓涉及到快取javaBean物件實現Serializable介面,否者會報NotSerializableException。因為快取的原理是將物件序列化後直接寫入資料庫中,如果不實現Serializable介面,會導致物件無法序列化,進而無法

安卓專案實戰強大的網路請求框架okGo使用詳解(二):深入理解Callback自定義JsonCallback

前言 JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快了傳輸速度,目前客戶端伺服器返回的資料大多都是基於這種格式的,相應的我們瞭解的關於json的解析工具主要有兩個:Gson(Google官方出的)和fas

安卓專案實戰強大的網路請求框架okGo使用詳解(一):實現get,post基本網路請求,下載上傳進度監聽以及對Callback自定義的深入理解

1.新增依賴 //必須使用 compile 'com.lzy.net:okgo:3.0.4' //以下三個選擇新增,okrx和okrx2不能同時使用,一般選擇新增最新的rx2支援即可 compile 'com.lzy.net:okrx:1.0.2' compile 'com.lzy

安卓專案實戰APP版本升級更新,適配安卓7.0

前言 APP的版本升級主要分為兩種方式: 1.應用市場升級 2.應用內升級 而應用內升級的方式是目前大多數APP採用的升級更新方式。 應用內升級的模式 按照不同的業務需求又可以分為兩種: 1,強制性更新 如果APP有更新,那麼則彈出更新提示對話方塊,並且

安卓專案實戰CoordinatorLayout實現頁面特效(一)

效果圖如下: material design控制元件簡介: 轉載自:https://blog.csdn.net/gitzzp/article/details/52573068 CoordinatorLayout CoordinatorLayout:協調者佈局。它是support

安卓專案實戰Glide 3高手養成(三):Glide的回撥與監聽

前言 通過前面兩篇的講解,我們對於Glide的一些使用都有了基本瞭解,知道了使用Glide載入圖片只需要一行程式碼即可: Glide.with(this).load(url).into(imageView); 而在這一行程式碼的背後,Glide幫我們執行了成千上萬行的邏輯。

安卓專案實戰Glide 3高手養成(一):Glide的基本使用

前言 現在Android上的圖片載入框架非常成熟,從最早的老牌圖片載入框架UniversalImageLoader,到後來Google推出的Volley,再到後來的新興軍Glide和Picasso,當然還有Facebook的Fresco。每一個都非常穩定,功能也都十分強大。但是它們的使用

安卓專案實戰記憶體洩漏檢測神器LeakCanary

為什麼會產生記憶體洩漏? Java記憶體洩漏指的是程序中某些物件(垃圾物件)已經沒有使用價值了,但有另外一個正在使用的物件持有它的引用,從而導致它不能回收停留在堆記憶體中,這就產生了記憶體洩漏。無用的物件佔據著記憶體空間,使得實際可使用記憶體變小,形象地說法就是記憶體洩漏了。 記憶體