1、縮放 指寬、高縮放web
(1)按比例縮放瀏覽器
在開發圖片瀏覽器等軟件是,不少時候要顯示圖片的縮略圖,而通常狀況下,咱們要將圖片按照固定大小取縮略圖,通常取縮略圖的方法是使用BitmapFactory的decodeFile方法,而後經過傳遞進去 BitmapFactory.Option類型的參數進行取縮略圖,在Option中,屬性值inSampleSize表示縮略圖大小爲原始圖片大小的幾分之一,即若是這個值爲2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片大小就爲原始大小的1/4。post
然而,若是咱們想取固定大小的縮略圖就比較困難了,好比,咱們想將不一樣大小的圖片去出來的縮略圖高度都爲200px,並且要保證圖片不失真,那怎麼辦?咱們總不能將原始圖片加載到內存中再進行縮放處理吧,要知道在移動開發中,內存是至關寶貴的,並且一張100K的圖片,加載完所佔用的內存何止 100K?spa
通過研究,發現,Options中有個屬性inJustDecodeBounds,研究了一下,終於明白是什麼意思了,SDK中的E文是這麼說的code
If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.orm
意思就是說若是該值設爲true那麼將不返回實際的bitmap不給其分配內存空間而裏面只包括一些解碼邊界信息即圖片大小信息,那麼相應的方法也就出來了,經過設置inJustDecodeBounds爲true,獲取到outHeight(圖片原始高度)和 outWidth(圖片的原始寬度),而後計算一個inSampleSize(縮放值),而後就能夠取圖片了,這裏要注意的是,inSampleSize 可能小於0,必須作判斷。也就是說先將Options的屬性inJustDecodeBounds設爲true,先獲取圖片的基本大小信息數據(信息沒有保存在bitmap裏面,而是保存在options裏面),經過options.outHeight和 options. outWidth獲取的大小信息以及本身想要到得圖片大小計算出來縮放比例inSampleSize,而後緊接着將inJustDecodeBounds設爲false,就能夠根據已經獲得的縮放比例獲得本身想要的圖片縮放圖了。對象
示例代碼:圖片
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; //只取邊界值信息
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此時返回bm爲空
options.inJustDecodeBounds = false; //取圖片實體
//縮放比。因爲是固定比例縮放,只用高或者寬其中一個數據進行計算便可 內存
int sampleSize = 1; //ci
if(options.outWidth > deviceWidth){ //deviceWidth 爲屏幕寬,這個值能夠本身設定
sampleSize = (int)options.outWidth / deviceWidth;
}
options.inSampleSize = sampleSize;
//從新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了
bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);
(2)按指定圖片寬高縮放
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
//縮放圖片的尺寸
float scaleWidth = (float) sWidth / bmpWidth; //按固定大小縮放 sWidth 寫多大就多大
float scaleHeight = (float) sHeight / bmpHeight; //
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);//產生縮放後的Bitmap對象
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);
bitmap.recycle(); //回收
2、圖片大小壓縮 compress
private Bitmap compressImage(Bitmap image,int size) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質量壓縮方法,這裏100表示不壓縮,把壓縮後的數據存放到baos中 int options = 100; while (baos.toByteArray().length/1024 > size) { // 循環判斷若是壓縮後圖片是否大於size,大於繼續壓縮 baos.reset();// 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這裏壓縮比options=50,把壓縮後的數據存放到baos中 options -= 10;// 每次都減小10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把壓縮後的數據baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream數據生成圖片 return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } }