編輯:關於android開發
在上一篇文章中(Android之圖片變換)主要說明了bitmap的使用,當然其中也包括一點圖片壓縮的內容,但是沒有詳細描述,這篇文章就來闡述一下平時Android使用的圖片壓縮技術
從圖片的壓縮方式區分:質量壓縮和尺寸壓縮。
質量壓縮是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,經過它壓縮的圖片文件大小會有改變,但是導入成bitmap後占得內存是不變的。因為要保持像素不變,所以它就無法無限壓縮,到達一個值之後就不會繼續變小了。顯然這個方法並不適用與縮略圖,其實也不適用於想通過壓縮圖片減少內存的適用,僅僅適用於想在保證圖片質量的同時減少文件大小的情況而已
尺寸壓縮是壓縮圖片的像素,一張圖片所占內存的大小 圖片類型*寬*高,通過改變三個值減小圖片所占的內存,防止OOM,當然這種方式可能會使圖片失真
質量壓縮:
public Bitmap compressImage(Bitmap image,int imageSize) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質量壓縮方法,這裡100表示不壓縮,把壓縮後的數據存放到baos中
int options = 100;
while ( baos.toByteArray().length / 1024>imageSize) { //循環判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這裡壓縮options%,把壓縮後的數據存放到baos中
options -= 10;//每次都減少10
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮後的數據baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數據生成圖片
return bitmap;
}
尺寸壓縮:
public void scalePic(int reqWidth,int reqHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);
options.inSampleSize = PhotoUtil.calculateInSampleSize(options, reqWidth,reqHeight);
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options);
postInvalidate();
}
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) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
根據具體需求也可以兩種壓縮方式結合使用
Android深度探索與HAL驅動開發(卷1)-- 第七章隨筆,android驅動開發應用程序、庫、內核、驅動程序的關系 從上到下,一個軟件系統可以分為
自定義水平進度條樣式:黑色虛線,進度條虛線布局layout中使用: 下面為xml源代碼myprogress.xml: 1 <?xml v
ReactNative的ViewPagerAndroid簡述 ViewPager是Android中比較常見的頁面切換控件, 同時, 在UIExplorerApp中也有
AndroidStudio怎樣導入jar包,androidstudiojarAndroidStudio用於開發安卓Apk非常地方便,但是它的很多設置都與Eclipse不一