成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術(shù)文章
文章詳情頁

Android 基于Bitmap的四種圖片壓縮方式

瀏覽:9日期:2022-09-18 17:22:37
目錄知識點(diǎn)介紹正文1、質(zhì)量壓縮2、采樣率壓縮3、縮放法壓縮4、RGB_565 通過改變圖片格式來實(shí)現(xiàn)壓縮總結(jié)知識點(diǎn)介紹

Android 中圖片主要以 Bitmap 的形式存在,所以壓縮圖片主要就是減少 Bitmap 的大小。Bitmap 的大小可以通過如下的公式計算得到:size = width * height * 單個像素所占字節(jié)數(shù)。因此壓縮圖片通過改變公式中的三個變量即可實(shí)現(xiàn)。

單個像素所占空間大小在 Android 中有多種,詳見如下

格式 所占空間 說明 Bitmap.Config.ALPHA_8 1B 該種格式表示圖片只有透明度沒有顏色,1個像素占用8位 Bitmap.Config.ARGB_4444 2B 該種格式表示圖片透明通道 A 及顏色 R、G、B 各占用4位,共16位 Bitmap.Config.ARGB_8888 4B 該種格式表示圖片透明通道 A 及顏色 R、G、B 各占用8位,共32位 Bitmap.Config.RGB_565 2B 該種格式表示圖片沒有透明通道,顏色 R、G、B 各占用5、6、6位,共16位

Android 中加載圖片默認(rèn)用的是 ARGB_8888 格式,所以加載一張3000 * 4000 的圖片默認(rèn)占用的空間為 45MB 左右,這個值還是很大的😂

測試代碼

fun showBitmapInfo(bitmap: Bitmap){Log.d('Tag','壓縮后的圖片大小:${bitmap.byteCount/1024/1024}MB,寬度:${bitmap.width},高度:${bitmap.height}')}

結(jié)果

Android 基于Bitmap的四種圖片壓縮方式

正文

接下來介紹四種壓縮方式

1、質(zhì)量壓縮

質(zhì)量壓縮主要通過 Bitmap.compress()實(shí)現(xiàn),方法介紹

/**** @param format 壓縮圖像的格式* @param quality 提示壓縮機(jī),0-100。 根據(jù)Bitmap.CompressFormat不同,該值的解釋也不同。* @param stream ?寫入壓縮數(shù)據(jù)的輸出流。* @return 如果成功壓縮到指定的流,則為true*/public boolean compress(CompressFormat format, int quality, OutputStream stream) {}

CompressFormat 表示圖片壓縮格式,Android 源碼中包含了五種格式

格式名 解釋 CompressFormat.JPEG 壓縮為JPEG格式。 quality 0表示壓縮為最小大小。 100表示壓縮以獲得最大視覺質(zhì)量。 CompressFormat.PNG 壓縮為PNG格式。 PNG是無損的,因此quality被忽略。 CompressFormat.WEBP 壓縮為WEBP格式。 quality 0表示壓縮為最小大小。 100表示壓縮以獲得最大視覺質(zhì)量。 從Build.VERSION_CODES.Q ,值100導(dǎo)致文件采用無損WEBP格式。 否則,文件將為有損WEBP格式 CompressFormat.WEBP_LOSSY 壓縮為WEBP有損格式。 quality 0表示壓縮為最小大小。 100表示壓縮以獲得最大視覺質(zhì)量。 CompressFormat.WEBP_LOSSLESS 壓縮為WEBP無損格式。 quality是指投入多少精力進(jìn)行壓縮。 值0表示快速壓縮,導(dǎo)致文件大小相對較大。 100表示要花費(fèi)更多時間進(jìn)行壓縮,從而使文件更小。

測試代碼

/** * 壓縮圖片質(zhì)量*/fun getCompressBitmap(bitmap: Bitmap,quality:Int): Bitmap { val baos = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos) val byte = baos.toByteArray() val ins = ByteArrayInputStream(byte) val bm = BitmapFactory.decodeStream(ins) ins.close() baos.close() return bm}

效果

Android 基于Bitmap的四種圖片壓縮方式

Android 基于Bitmap的四種圖片壓縮方式

根據(jù)上面的日志,你會看到質(zhì)量壓縮并不能改變圖片在內(nèi)存中的大小,因?yàn)橘|(zhì)量壓縮既不能改變圖片分辨率也不能改變圖片的單個像素大小。

那么你可能有些疑問:既然不能改變大小,那么還費(fèi)這么大功夫轉(zhuǎn)化而且圖片還失真是為了什么?

答:源碼中對于compress方法的解釋是,將位圖的壓縮版本寫入指定的輸出流。所以應(yīng)該是對輸出流中的字節(jié)數(shù)有影響

驗(yàn)證

val baos = ByteArrayOutputStream()bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos)val byte = baos.toByteArray()Log.d('Tag','quality=$quality,byte-size=${byte.size}')

結(jié)果真的是對輸出流的字節(jié)數(shù)有影響

Android 基于Bitmap的四種圖片壓縮方式

2、采樣率壓縮

BitmapFactory.Options 中有個屬性 inSampleSize,系統(tǒng)中采樣率壓縮就是通過該屬性

/*** 如果設(shè)置為大于1的值,則請求解碼器對原始圖像進(jìn)行二次采樣,返回較小的圖像以節(jié)省內(nèi)存。* 樣本大小是任一維度中與解碼后的位圖中的單個像素相對應(yīng)的像素數(shù)。 例如,inSampleSize == 4* 返回的圖像為原始寬度/高度的1/4,像素數(shù)目的1/16。 任何小于等于1的值都與1相同。* 注意:解碼器使用基于2的冪的最終值,任何其他值將四舍五入為最接近的2的冪。**/ public int inSampleSize;

直接上代碼

/** * 根據(jù)設(shè)定的寬高計算縮放比 */ fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {val height = options.outHeightval width = options.outWidthvar inSampleSize = 1if (height > reqHeight || width > reqWidth) { val heightRatio = round(height.toFloat() / reqHeight.toFloat()).toInt() val widthRatio = round(width.toFloat() / reqWidth.toFloat()).toInt() inSampleSize = if (heightRatio < widthRatio) heightRatio else widthRatio}return inSampleSize } /** * 獲取縮放后的圖片 */ fun getSmallBitmap(filePath: String,reqWidth: Int,reqHeight: Int): Bitmap {val options = BitmapFactory.Options()options.inJustDecodeBounds = true //不加載 bitmap 進(jìn)內(nèi)存,只獲取他的基本信息BitmapFactory.decodeFile(filePath, options)options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)options.inJustDecodeBounds = falsereturn BitmapFactory.decodeFile(filePath, options) }

結(jié)果

Android 基于Bitmap的四種圖片壓縮方式

采樣率壓縮的方式使用的還是挺多的,因?yàn)槲覀儷@取到的圖片它的尺寸可能很大,但是我們在手機(jī)上顯示的可能不需要那么大,那我們就將圖片縮放成我們需要的大小。

3、縮放法壓縮

這種方法主要是依賴 Matrix 矩陣變換的方式對圖片進(jìn)行處理。Matrix 中有很多對圖片變換的 api 這里只使用它的縮放功能,其他功能可以自行了解

代碼

/** * 通過矩陣縮放 */ fun matrixBitmap(bitmap: Bitmap,scale:Float):Bitmap{val matrix = Matrix()matrix.setScale(scale,scale)var bm = Bitmap.createBitmap(bitmap,0,0,bitmap.width,bitmap.height,matrix,true)return bm }

當(dāng)設(shè)置縮放比為0.5時,圖片整體就縮放為原來的1/4

Android 基于Bitmap的四種圖片壓縮方式

4、RGB_565 通過改變圖片格式來實(shí)現(xiàn)壓縮

系統(tǒng)默認(rèn)使用的是ARGB_8888的格式,所以我們只要改變這個 options 值就能實(shí)現(xiàn)

fun rgb565Bitmap(filePath: String):Bitmap{val options = BitmapFactory.Options()options.inPreferredConfig = Bitmap.Config.RGB_565var bitmap = BitmapFactory.decodeFile(filePath,options)return bitmap}

結(jié)果圖片變成了原圖的一半

Android 基于Bitmap的四種圖片壓縮方式

總結(jié)

對于圖片的壓縮,首先可以先將圖片格式改為 RGB_565,這樣圖片先減小一半,然后對于圖片的顯示可以使用采樣率壓縮或者縮放壓縮的方式將圖片的分辨率改為我們顯示的大小,如果是要將圖片上傳服務(wù)器那么可以使用質(zhì)量壓縮的方式,但是這種方式不支持 png 格式的圖片。

以上就是Android 基于Bitmap的四種圖片壓縮方式的詳細(xì)內(nèi)容,更多關(guān)于Android Bitmap圖片壓縮的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 国产视频三区 | 成人午夜看片在线观看 | 国内精品国语自产拍在线观看55 | 亚洲视频在线观看网站 | 欧美激情第一欧美在线 | 乱人伦中文视频在线 | 久久黄色网址 | 扒开双腿猛进入喷水免费视频 | 欧美美女一区二区三区 | 喷潮白浆| 快色网站 | 久久久国产精品免费看 | 国产亚洲精品久久久久久久 | 18年大片免费在线 | 亚洲精品一区二区久久这里 | 在线 | 一区二区三区 | 亚洲一区二区免费 | 亚洲成a人片在线网站 | 亚洲另类视频在线观看 | 精品在线视频一区 | 亚洲国产成人久久笫一页 | 国产高清美女一级a毛片久久 | 另类欧美视频 | 中文字幕在线观看不卡视频 | avove在线播放| 特黄a三级三级三级 | 黄色福利站| 又黄又刺激下面流水的视频 | 久久只有这才是精品99 | 国产成人最新毛片基地 | a级国产乱理伦片在线观看 a级国产乱理伦片在线观看99 | 窝窝社区在线观看www | 成人的天堂 | 毛片亚洲毛片亚洲毛片 | 亚洲国产精品久久久久 | 国产精品成人免费视频不卡 | 激情6月丁香婷婷色综合 | 久久有这有精品在线观看 | 九九欧美 | 久久精品国产一区二区三区日韩 | 加勒比毛片 |