国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Bitmap壓縮方法的選擇詳解

2019-12-12 05:11:33
字體:
來源:轉載
供稿:網友

剛剛修改Bug碰到了一個問題,先描述一下問題。

1.測試說分享文章到微信失敗,QQ成功。

定位到微信分享接口。

2.分享其它文章到微信成功。

接口有問題!差點就找接口了,還好沒

3.斷點微信分享,發現突然壓縮失敗。

代碼寫法問題,下面會分解

4.找到原因,微信對分享縮略圖大小有32k的限制,代碼是對文章的第一張圖片進行壓縮,圖片太大,壓縮代碼也有問題。

開始解決問題

這里有兩種解決方法:
1.接口提供文章對應的分享內容,在編輯人員編輯文章的時候就對這些數據進行了限制。

{  "title":"how to begain Android?",  "content":"do it, do it, do it",  "picture":"http://192.168.0.1/pic/2015/09/02/share_thumb.jpg"  ...  ...}

picture字段是<32K的縮略圖。

ps:就我現在的水平來說,個人覺得這種是最好的,不是說Android省事,而是對于今后的擴展和整體項目的擴展規劃來說都是比較好的,當然,水平有限,也許我看得還不夠遠,希望指教。

2.對獲取的文章圖片進行壓縮。

當前項目無法對接口進行修改(駱駝太大了),所以只能對圖片進行壓縮了,這就談到上面的坑了。先看原來寫的壓縮代碼:

----可能出錯的代碼----

int options = 100; ByteArrayOutputStream outputs = new ByteArrayOutputStream(); oBitmap.compress(Bitmap.CompressFormat.JPEG, options, outputs); //while ( outputs.toByteArray().length / 1024 > 32 ) {   outputs.reset();  oBitmap.compress(Bitmap.CompressFormat.JPEG, options, outputs);  options -= 10 ;}ByteArrayInputStream inputs = new ByteArrayInputStream(outputs.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(inputs, null , null );

這里用了bitmap的compress()方法進行了所謂的'質量壓縮',控制參數就是options的值,但是出問題的地方也就是這個options的值,當圖片非常大的時候,即使options為0的時候,圖片還是大于32K,這個時候在while中option就為負數了,再進行compress()操作就會拋出throw new IllegalArgumentException("quality must be 0..100");的錯誤。

原因:

使用compress()方法的options值進行壓縮的方法是不會丟失像素的,只是通過修改圖片的其它比如透明度等屬性,使得圖片大小變化而已,所以它就無法無限壓縮,到達一個值之后就不會繼續變小了。

解決:

第一時間想到的是進行質量壓縮后,當options為0的時候,還是大于32K的話,就進行采樣率壓縮。

BitmapFactory.Options newOpts = new BitmapFactory.Options();newOpts.inSampleSize = 2;bitmap = BitmapFactory.decodeFile(picturePath, newOpts);

每次判斷bitmap的大小,對BitmapFactory.Options的inSampleSize進行+1或者-1(不能小于1)操作就好。但是inSampleSize的值為int類型,當圖片很大的時候,1/2, 1/3, 1/4的差距還是有些大。所以只能放棄,最后采用了縮放的方法,先上代碼:

public static byte[] WeChatBitmapToByteArray(Bitmap bmp, boolean needRecycle) {  // 首先進行一次大范圍的壓縮  ByteArrayOutputStream output = new ByteArrayOutputStream();  bmp.compress(Bitmap.CompressFormat.JPEG, 100, output);  float zoom = (float)Math.sqrt(32 * 1024 / (float)output.toByteArray().length); //獲取縮放比例  // 設置矩陣數據  Matrix matrix = new Matrix();  matrix.setScale(zoom, zoom);   // 根據矩陣數據進行新bitmap的創建  Bitmap resultBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);  output.reset();  resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);  // 如果進行了上面的壓縮后,依舊大于32K,就進行小范圍的微調壓縮  while(output.toByteArray().length > 32 * 1024){    matrix.setScale(0.9f, 0.9f);//每次縮小 1/10    resultBitmap = Bitmap.createBitmap(                  resultBitmap, 0, 0,                   resultBitmap.getWidth(), resultBitmap.getHeight(), matrix,true);    output.reset();    resultBitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);  }  return result;}

至此,暫時補上了這個一開始不規范導致的問題。當然,以上的解釋都是從書本和我大互聯網中獲取的方法,我進行了一些整合,如果你也遇到的這個問題,也有幸這篇文章被你看到,能幫到一二,就是我的本意了。

通過此文希望能幫助到有需要的同學,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浦东新区| 稷山县| 兴仁县| 错那县| 嘉义县| 明星| 富宁县| 呈贡县| 漳浦县| 沅陵县| 南和县| 手游| 庐江县| 义乌市| 四子王旗| 玉溪市| 凤城市| 芒康县| 北安市| 丹寨县| 东乡族自治县| 安溪县| 临夏市| 阜平县| 扎鲁特旗| 呼图壁县| 罗山县| 三穗县| 灵山县| 孟州市| 钟山县| 屏南县| 和林格尔县| 清新县| 溧水县| 惠东县| 尉犁县| 塔城市| 乌审旗| 邯郸县| 报价|