【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
生活随笔
收集整理的這篇文章主要介紹了
【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、 圖片壓縮
- 二、 圖片文件壓縮類型
- 三、 Android 原生 API 提供的質量壓縮
- 四、 Android 原生 API 提供的尺寸壓縮
一、 圖片壓縮
圖片壓縮 :
① 文件壓縮 : 圖片的文件壓縮 , 一張圖片可以經過壓縮 , 占用更少的磁盤或網絡空間 ;
② 文件壓縮應用場景 :
- 網絡傳輸圖片 : 上傳圖片至服務器 , 為了 節省占用的帶寬資源 , 將圖片文件進行壓縮 ;
- 保存圖片 : 保存圖片到設備的 SD 卡 , 為了 節省磁盤資源 , 將圖片文件進行壓縮 ;
③ 內存壓縮 : 與文件壓縮相對應的是內存壓縮 , 在 內存中如何使用更少的內存顯示出想要顯示的圖片 ; 在之后的博客中會詳細介紹 ;
二、 圖片文件壓縮類型
圖片文件壓縮類型 :
① 質量壓縮 :
- 壓縮清晰度 : 將圖片的清晰度降低 , 一些畫面的細節被模糊掉了 , 這些細節盡量不要讓肉眼觀察出來 ;
- 有損壓縮 : 壓縮后有信息損失 , 無法復原 ;
② 尺寸壓縮 : 減小圖片的尺寸大小 , 明顯這個也是有損的 , 無法復原 ;
③ 不同壓縮格式的壓縮率 : webp > jpeg > png ;
- 如果圖片不需要透明度 ( alpha ) 通道的信息 , 推薦使用 JPEG ;
- webp 目前使用還不是很廣泛 ;
三、 Android 原生 API 提供的質量壓縮
圖片質量壓縮函數原型 : 下面的函數原型中給出了詳細注釋 ;
① 函數作用 : 傳入壓縮參數 , 將壓縮的內容輸出到文件或網絡中 ;
② 參數解析 :
- CompressFormat format 參數 : 被壓縮的目標格式, 要將該圖片壓縮成什么格式 JPEG, PNG, WEBP , 壓縮格式從下面的枚舉類型中獲取 ;
- int quality 參數 : 給壓縮器的質量, 0-100 ; 0 壓縮到極限最小 , 100 壓縮時最高質量 , PNG 圖片是無損圖片格式 , 其質量不能被降低 , 會忽略該參數 ;
- OutputStream stream 參數 : 寫出被壓縮圖片的輸出流, 可以是文件輸出流 , 也可以是網絡流 ;
③ 返回值 : 如果壓縮成功, 并寫出到指令的輸出流, 返回 true ;
/*** 寫出該位圖壓縮后的版本到輸出流中* 如果該方法返回 true, 該位圖可以向 BitmapFactory.decodeStream() 傳入對應輸入流進行恢復. * 傳入的壓縮配置并不是所有的格式都接收所有的配置,* 從 BitmapFactory 返回的位圖極有可能與原圖位深度不同,* 如果是 JPEG 格式, 其沒有透明度通道, 只支持** @param format 被壓縮的目標格式, 要將該圖片壓縮成什么格式 JPEG, PNG, WEBP * @param quality 給壓縮器的質量, 0-100. 0 壓縮到極限最小, 100 壓縮時最高質量* PNG 圖片是無損圖片格式, 其質量不能被降低, 會忽略該參數; * @param stream 寫出被壓縮圖片的輸出流, 可以是文件輸出流 , 也可以是網絡流* @return 如果壓縮成功, 并寫出到指令的輸出流, 返回 true*/@WorkerThreadpublic boolean compress(CompressFormat format, int quality, OutputStream stream) {// 首先檢查該圖片是否被回收, 如果已經被回收, 直接丟出異常退出checkRecycled("Can't compress a recycled bitmap");// 調用輸出流時會調用 Native 方法, 顯示檢查該流是否合法if (stream == null) {throw new NullPointerException();}// 輸入的質量是否合法if (quality < 0 || quality > 100) {throw new IllegalArgumentException("quality must be 0..100");}// 嚴格模式 StrictMode.noteSlowCall("Compression of a bitmap is slow");// 輸出壓縮過程中的執行細節Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress");// 執行 Native 方法, 壓縮圖片boolean result = nativeCompress(mNativePtr, format.nativeInt,quality, stream, new byte[WORKING_COMPRESS_STORAGE]);Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);return result;}四、 Android 原生 API 提供的尺寸壓縮
圖片尺寸壓縮函數原型 : 下面的函數原型中給出了詳細注釋 ;
① 函數作用 : 創建一個新的 Bitmap 對象 , 縮放一張已存在的位圖 ; 如果指定的寬高與當前源位圖的寬高一致 , 那么直接將源位圖返回 ;
② 參數解析 :
- Bitmap src 參數 : 位圖原圖 ;
- int dstWidth 參數 : 圖片轉換后的目標寬度 ;
- int dstHeight 參數 : 圖片轉換后的目標高度 ;
- boolean filter 參數 : 設置縮放圖像時是否使用雙線性濾波 ; 如果設置成 true , 則使用雙線性濾波 , 當縮放時圖片質量更好 , 但是會降低性能 ; 如果設置成 false , 使用最近鄰法進行尺寸縮放 , 圖片質量差 , 但是速度很快 ; 推薦默認設置成 true , 雙線性濾波開銷很小 , 對于圖像質量的改善效果顯著 ;
③ 返回值 : 返回新的被縮放好的 Bitmap 位圖 , 如果縮放失敗 , 返回源圖 ;
/*** 創建一個新的 Bitmap 對象 , 縮放一張已存在的位圖 ;* 如果指定的寬高與當前源位圖的寬高一致 , 那么直接將源位圖返回** @param src 位圖原圖* @param dstWidth 圖片轉換后的目標寬度* @param dstHeight 圖片轉換后的目標高度* @param filter 設置縮放圖像時是否使用雙線性濾波. * 如果設置成 true , 則使用雙線性濾波 , * 當縮放時圖片質量更好 , 但是會降低性能 ; * 如果設置成 false , 使用最近鄰法進行尺寸縮放 ,* 圖片質量差 , 但是速度很快 ;* 推薦默認設置成 true , 雙線性濾波開銷很小 , 對于圖像質量的改善效果顯著 ;* @return 返回新的被縮放好的 Bitmap 位圖 , 如果縮放失敗 , 返回源圖 ;* @throws IllegalArgumentException 如果傳入的寬高值參數小于等于 0, 拋出異常 ;*/public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,boolean filter) {Matrix m = new Matrix();final int width = src.getWidth();final int height = src.getHeight();if (width != dstWidth || height != dstHeight) {final float sx = dstWidth / (float) width;final float sy = dstHeight / (float) height;m.setScale(sx, sy);}/*最終調用的是 public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height,@Nullable Matrix m, boolean filter) 方法 , 后續博客有詳細解析*/return Bitmap.createBitmap(src, 0, 0, width, height, m, filter);}總結
以上是生活随笔為你收集整理的【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 内存优化】内存抖动 (
- 下一篇: 【Android 内存优化】Androi