編輯:關於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 百度地圖 SDK v3.0.0 (二) 定位與結合
三種布局方式android對布局優化提供了三種布局:這三種布局都可以簡化我們的布局文件,優化繪制流程,下面我們簡單看一下這三種組件的使用方式。1、重用布局"ht
1.初始使用android:completionThreshold="1"的作用是提示功能從第一個字母開始package com.treasure_c
1. SurfaceView的定義通常情況程序的View和用戶響應都是在同一個線程中處理的,這也是為什麼處理長時間事件(例如訪問網絡)需要放到另外的線程中去(防止阻塞當前