Android圖片壓縮的實(shí)例詳解
Android圖片壓縮的實(shí)例詳解
在做微信分享的時(shí)候,由于分享的縮略圖要求不得大于32K,否則不能調(diào)起微信,所以總結(jié)了一下Android圖片的壓縮問(wèn)題,大部分資料都是來(lái)自網(wǎng)上各位的分享,自己只是完善或修改了一下,本著繼續(xù)分享的精神,也方便自己記憶,于是總結(jié)如下。
android圖片壓縮主要有兩種方式:1.壓縮圖片分辨率 2.壓縮圖片質(zhì)量
一、先看壓縮圖片分辨率,很好理解,如本來(lái)1280*768的圖片壓縮為640*384大小。廢話不說(shuō),直接上代碼:
/** * 按比例壓縮圖片分辨率 * @param inBitmap * @param outHeight 輸出圖片高度,可據(jù)此保持比例計(jì)算輸出寬度 * @param needRecycled 是否回收inBitmap * @return */ public static Bitmap createScaledBitmapByOutHeight(Bitmap inBitmap, int outHeight, boolean needRecycled) { int bitmapHeight = inBitmap.getHeight(); int bitmapWidth = inBitmap.getWidth(); int outWidth = bitmapWidth * outHeight / bitmapHeight; return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled); } /** * 按比例壓縮圖片分辨率 * @param inBitmap * @param outHeight 輸出圖片寬度,可據(jù)此保持比例計(jì)算輸出高度 * @param needRecycled 是否回收inBitmap * @return */ public static Bitmap createScaledBitmapByOutWidth(Bitmap inBitmap, int outWidth, boolean needRecycled) { int bitmapHeight = inBitmap.getHeight(); int bitmapWidth = inBitmap.getWidth(); int outHeight = bitmapHeight * outWidth / bitmapWidth; return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled); } /** * 指定輸出的寬高縮放圖片 * @param inBitmap * @param outWidth * @param outHeight * @param needRecycled * @return */ public static Bitmap createScaledBitmap(Bitmap inBitmap, int outWidth, int outHeight, boolean needRecycled) { Bitmap thumbBmp = Bitmap.createScaledBitmap(inBitmap, outWidth, outHeight, true); if (needRecycled) { inBitmap.recycle(); } return thumbBmp; }
前兩個(gè)方法可以指定期望的寬度或高度,并按比例縮放圖片的分辨率,第3個(gè)方法可以隨意指定期望的寬高,縮放圖片。
上面代碼是對(duì)輸入的bitmap進(jìn)行縮放,還可以從資源或文件中加載圖片并縮放,具體如下:
/** * 從資源加載并壓縮圖片 * @param res * @param resId * @param outWidth 目標(biāo)寬度 * @param outHeight 目標(biāo)高度 * @return */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int outWidth, int outHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 假解,來(lái)獲取圖片大小 BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight); // 使用獲取到的inSampleSize值再次解析圖片 options.inJustDecodeBounds = false; //options.inPreferredConfig = Config.RGB_565; return BitmapFactory.decodeResource(res, resId, options); } /** * 從文件中加載并壓縮圖片 * @param res * @param resId * @param outWidth 目標(biāo)寬度 * @param outHeight 目標(biāo)高度 * @return */ public static Bitmap decodeSampledBitmapFromFile(String pathName, int outWidth, int outHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 假解,來(lái)獲取圖片大小 BitmapFactory.decodeFile(pathName, options); options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight); // 使用獲取到的inSampleSize值再次解析圖片 options.inJustDecodeBounds = false; //options.inPreferredConfig = Config.RGB_565; return BitmapFactory.decodeFile(pathName, options); } /** * 計(jì)算options.inSampleSize * @param options * @param reqWidth * @param reqHeight * @return */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源圖片的高度和寬度 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // 計(jì)算出實(shí)際寬高和目標(biāo)寬高的比率 final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // 選擇寬和高中最小的比率作為inSampleSize的值,這樣可以保證最終圖片的寬和高 // 一定都會(huì)大于等于目標(biāo)的寬和高。 inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
二、壓縮圖片的質(zhì)量
/** * 壓縮圖片質(zhì)量,把圖片壓縮到outSize以內(nèi) * @param inBitmap 原始bitmap * @param outSize 壓縮到的大小 * @param needRecycled 是否回收bitmap * @return */ public static Bitmap compressImage(Bitmap inBitmap, int outSize, boolean needRecycled) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); inBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); int quality = 100; while (baos.toByteArray().length / 1024 > outSize) { if (quality <= 0) { ByteArrayInputStream outBais = new ByteArrayInputStream(baos.toByteArray()); return BitmapFactory.decodeStream(outBais, null, null);// 如果quaLity為0時(shí)還未達(dá)到32k以內(nèi),返回得到的最小值;如需要可結(jié)合分辨率壓縮 } baos.reset(); //PNG格式下,這種壓縮不起作用(quality:0-100,如果目標(biāo)大小太小,有時(shí)候質(zhì)量壓縮不一定能達(dá)到效果,需結(jié)合分辨率壓縮) inBitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); Log.e("AN", "bitmap size:"+ baos.toByteArray().length / 1024 + "k"); quality -= 10; } if (needRecycled) { inBitmap.recycle(); } ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); Bitmap outBitmap= BitmapFactory.decodeStream(bais, null, null);//ByteArrayInputStream轉(zhuǎn)成bitmap return outBitmap; }
需要注意的是compress方法,該壓縮方法只對(duì)JPEG格式有效,對(duì)于PNG格式,則會(huì)忽略第二個(gè)參數(shù)quality,即壓縮不起作用。這種壓縮只是對(duì)圖片質(zhì)量有影響,并不會(huì)改變圖片大小。
當(dāng)然,如有需要,以上兩種壓縮方法可以結(jié)合使用。
以上就是Android 圖片壓縮的實(shí)現(xiàn)方法的詳解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android實(shí)現(xiàn)Service獲取當(dāng)前位置(GPS+基站)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)Service獲取當(dāng)前位置(GPS+基站)的方法,較為詳細(xì)的分析了Service基于GPS位置的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09Android中簡(jiǎn)單的電話管理與短信管理App編寫(xiě)實(shí)例
這篇文章主要介紹了Android中簡(jiǎn)單的電話管理與短信管理App編寫(xiě)實(shí)例,包括監(jiān)聽(tīng)電話的呼叫狀態(tài)以及短信群發(fā)聯(lián)系人選擇等基本功能的實(shí)現(xiàn),代碼突出要點(diǎn),需要的朋友可以參考下2016-04-04Android編程獲取網(wǎng)絡(luò)連接方式及判斷手機(jī)卡所屬運(yùn)營(yíng)商的方法
這篇文章主要介紹了Android編程獲取網(wǎng)絡(luò)連接方式及判斷手機(jī)卡所屬運(yùn)營(yíng)商的方法,涉及Android針對(duì)網(wǎng)絡(luò)的判斷及本機(jī)信息的獲取技巧,需要的朋友可以參考下2016-01-01Android中沒(méi)有插入SD情況下的文件寫(xiě)入和讀取方法
在Android開(kāi)發(fā)時(shí)會(huì)遇到如下一種場(chǎng)合希望應(yīng)用下載到當(dāng)前應(yīng)用的根目錄下,而非SD卡中然后可以隨時(shí)被該應(yīng)用或其他應(yīng)用訪問(wèn)這個(gè)文件,即具有被全局讀取的權(quán)限2012-11-11Android文字匹配度算法及實(shí)際應(yīng)用示例
本文介紹了Android應(yīng)用中常用的文字匹配度算法Levenshtein Distance,并給出了實(shí)際應(yīng)用示例,通過(guò)合理選擇和應(yīng)用文字匹配度算法,可以實(shí)現(xiàn)多種功能,提升用戶體驗(yàn),增強(qiáng)應(yīng)用的實(shí)用性,需要的朋友可以參考下2024-05-05AndroidStudio集成OpenCV的實(shí)現(xiàn)教程
本文主要介紹了Android?Studio集成OpenCV的實(shí)現(xiàn)教程,文中通過(guò)圖文介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12從Cocos2d-x2遷移到Cocos2d-x3的過(guò)程分享
Cocos2d-x 3.0發(fā)布沒(méi)多久,我就迫不及待地將手頭的一個(gè)習(xí)作嘗試從2.2.2版本遷移到3.0rc0引擎上,本問(wèn)介紹了遷移流程和遇到的問(wèn)題,以及發(fā)現(xiàn)了針對(duì)Android平臺(tái)的變動(dòng),需要的朋友可以參考下2014-04-04AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程
這篇文章主要介紹了AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04簡(jiǎn)單談?wù)刟ndroid studio 的單元測(cè)試
昨天在完善項(xiàng)目的時(shí)候,需要進(jìn)行單元測(cè)試,在Eclipse環(huán)境中進(jìn)行是很簡(jiǎn)單的,但是在Android Studio環(huán)境中進(jìn)行單元測(cè)試,在國(guó)內(nèi)找了很多資料,大都是人云亦云,本文發(fā)布出來(lái)供大家學(xué)習(xí)參考。2016-08-08Android編程之匿名內(nèi)部類與回調(diào)函數(shù)用法分析
這篇文章主要介紹了Android編程之匿名內(nèi)部類與回調(diào)函數(shù)用法,結(jié)合實(shí)例形式分析了Android編程中所涉及的java匿名內(nèi)部類與回調(diào)函數(shù)的概念、定義、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-10-10