日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

發(fā)布時間:2025/6/17 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、 圖片壓縮
  • 二、 圖片文件壓縮類型
  • 三、 Android 原生 API 提供的質(zhì)量壓縮
  • 四、 Android 原生 API 提供的尺寸壓縮





一、 圖片壓縮



圖片壓縮 :


① 文件壓縮 : 圖片的文件壓縮 , 一張圖片可以經(jīng)過壓縮 , 占用更少的磁盤或網(wǎng)絡(luò)空間 ;

② 文件壓縮應(yīng)用場景 :

  • 網(wǎng)絡(luò)傳輸圖片 : 上傳圖片至服務(wù)器 , 為了 節(jié)省占用的帶寬資源 , 將圖片文件進行壓縮 ;
  • 保存圖片 : 保存圖片到設(shè)備的 SD 卡 , 為了 節(jié)省磁盤資源 , 將圖片文件進行壓縮 ;

③ 內(nèi)存壓縮 : 與文件壓縮相對應(yīng)的是內(nèi)存壓縮 , 在 內(nèi)存中如何使用更少的內(nèi)存顯示出想要顯示的圖片 ; 在之后的博客中會詳細介紹 ;





二、 圖片文件壓縮類型



圖片文件壓縮類型 :


① 質(zhì)量壓縮 :

  • 壓縮清晰度 : 將圖片的清晰度降低 , 一些畫面的細節(jié)被模糊掉了 , 這些細節(jié)盡量不要讓肉眼觀察出來 ;
  • 有損壓縮 : 壓縮后有信息損失 , 無法復(fù)原 ;

② 尺寸壓縮 : 減小圖片的尺寸大小 , 明顯這個也是有損的 , 無法復(fù)原 ;

③ 不同壓縮格式的壓縮率 : webp > jpeg > png ;

  • 如果圖片不需要透明度 ( alpha ) 通道的信息 , 推薦使用 JPEG ;
  • webp 目前使用還不是很廣泛 ;




三、 Android 原生 API 提供的質(zhì)量壓縮



圖片質(zhì)量壓縮函數(shù)原型 : 下面的函數(shù)原型中給出了詳細注釋 ;


① 函數(shù)作用 : 傳入壓縮參數(shù) , 將壓縮的內(nèi)容輸出到文件或網(wǎng)絡(luò)中 ;

② 參數(shù)解析 :

  • CompressFormat format 參數(shù) : 被壓縮的目標(biāo)格式, 要將該圖片壓縮成什么格式 JPEG, PNG, WEBP , 壓縮格式從下面的枚舉類型中獲取 ;
/*** Bitmap 位圖只能被壓縮成以下三種格式*/public enum CompressFormat {JPEG (0),PNG (1),WEBP (2);CompressFormat(int nativeInt) {this.nativeInt = nativeInt;}final int nativeInt;}
  • int quality 參數(shù) : 給壓縮器的質(zhì)量, 0-100 ; 0 壓縮到極限最小 , 100 壓縮時最高質(zhì)量 , PNG 圖片是無損圖片格式 , 其質(zhì)量不能被降低 , 會忽略該參數(shù) ;
  • OutputStream stream 參數(shù) : 寫出被壓縮圖片的輸出流, 可以是文件輸出流 , 也可以是網(wǎng)絡(luò)流 ;

③ 返回值 : 如果壓縮成功, 并寫出到指令的輸出流, 返回 true ;

/*** 寫出該位圖壓縮后的版本到輸出流中* 如果該方法返回 true, 該位圖可以向 BitmapFactory.decodeStream() 傳入對應(yīng)輸入流進行恢復(fù). * 傳入的壓縮配置并不是所有的格式都接收所有的配置,* 從 BitmapFactory 返回的位圖極有可能與原圖位深度不同,* 如果是 JPEG 格式, 其沒有透明度通道, 只支持** @param format 被壓縮的目標(biāo)格式, 要將該圖片壓縮成什么格式 JPEG, PNG, WEBP * @param quality 給壓縮器的質(zhì)量, 0-100. 0 壓縮到極限最小, 100 壓縮時最高質(zhì)量* PNG 圖片是無損圖片格式, 其質(zhì)量不能被降低, 會忽略該參數(shù); * @param stream 寫出被壓縮圖片的輸出流, 可以是文件輸出流 , 也可以是網(wǎng)絡(luò)流* @return 如果壓縮成功, 并寫出到指令的輸出流, 返回 true*/@WorkerThreadpublic boolean compress(CompressFormat format, int quality, OutputStream stream) {// 首先檢查該圖片是否被回收, 如果已經(jīng)被回收, 直接丟出異常退出checkRecycled("Can't compress a recycled bitmap");// 調(diào)用輸出流時會調(diào)用 Native 方法, 顯示檢查該流是否合法if (stream == null) {throw new NullPointerException();}// 輸入的質(zhì)量是否合法if (quality < 0 || quality > 100) {throw new IllegalArgumentException("quality must be 0..100");}// 嚴(yán)格模式 StrictMode.noteSlowCall("Compression of a bitmap is slow");// 輸出壓縮過程中的執(zhí)行細節(jié)Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress");// 執(zhí)行 Native 方法, 壓縮圖片boolean result = nativeCompress(mNativePtr, format.nativeInt,quality, stream, new byte[WORKING_COMPRESS_STORAGE]);Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);return result;}



四、 Android 原生 API 提供的尺寸壓縮



圖片尺寸壓縮函數(shù)原型 : 下面的函數(shù)原型中給出了詳細注釋 ;


① 函數(shù)作用 : 創(chuàng)建一個新的 Bitmap 對象 , 縮放一張已存在的位圖 ; 如果指定的寬高與當(dāng)前源位圖的寬高一致 , 那么直接將源位圖返回 ;

② 參數(shù)解析 :

  • Bitmap src 參數(shù) : 位圖原圖 ;
  • int dstWidth 參數(shù) : 圖片轉(zhuǎn)換后的目標(biāo)寬度 ;
  • int dstHeight 參數(shù) : 圖片轉(zhuǎn)換后的目標(biāo)高度 ;
  • boolean filter 參數(shù) : 設(shè)置縮放圖像時是否使用雙線性濾波 ; 如果設(shè)置成 true , 則使用雙線性濾波 , 當(dāng)縮放時圖片質(zhì)量更好 , 但是會降低性能 ; 如果設(shè)置成 false , 使用最近鄰法進行尺寸縮放 , 圖片質(zhì)量差 , 但是速度很快 ; 推薦默認(rèn)設(shè)置成 true , 雙線性濾波開銷很小 , 對于圖像質(zhì)量的改善效果顯著 ;

③ 返回值 : 返回新的被縮放好的 Bitmap 位圖 , 如果縮放失敗 , 返回源圖 ;

/*** 創(chuàng)建一個新的 Bitmap 對象 , 縮放一張已存在的位圖 ;* 如果指定的寬高與當(dāng)前源位圖的寬高一致 , 那么直接將源位圖返回** @param src 位圖原圖* @param dstWidth 圖片轉(zhuǎn)換后的目標(biāo)寬度* @param dstHeight 圖片轉(zhuǎn)換后的目標(biāo)高度* @param filter 設(shè)置縮放圖像時是否使用雙線性濾波. * 如果設(shè)置成 true , 則使用雙線性濾波 , * 當(dāng)縮放時圖片質(zhì)量更好 , 但是會降低性能 ; * 如果設(shè)置成 false , 使用最近鄰法進行尺寸縮放 ,* 圖片質(zhì)量差 , 但是速度很快 ;* 推薦默認(rèn)設(shè)置成 true , 雙線性濾波開銷很小 , 對于圖像質(zhì)量的改善效果顯著 ;* @return 返回新的被縮放好的 Bitmap 位圖 , 如果縮放失敗 , 返回源圖 ;* @throws IllegalArgumentException 如果傳入的寬高值參數(shù)小于等于 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);}/*最終調(diào)用的是 public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height,@Nullable Matrix m, boolean filter) 方法 , 后續(xù)博客有詳細解析*/return Bitmap.createBitmap(src, 0, 0, width, height, m, filter);}

總結(jié)

以上是生活随笔為你收集整理的【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。