Android 獲取圖片之固定大小的縮略圖(一)

 

 在開發圖片瀏覽器等軟件是,很多時候要顯示圖片的縮略圖,而一般情況下,我們要將圖片按照固定大小取縮略圖,一般取縮略圖的方法是使用BitmapFactory的decodeFile方法,然後通過傳遞進去BitmapFactory.Option類型的參數進行取縮略圖,在Option中,屬性值inSampleSize表示縮略圖大小爲原始圖片大小的幾分之一,即如果這個值爲2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片大小就爲原始大小的1/4。

然而,如果我們想取固定大小的縮略圖就比較困難了,比如,我們想將不同大小的圖片去出來的縮略圖高度都爲200px,而且要保證圖片不失真,那怎麼辦?我們總不能將原始圖片加載到內存中再進行縮放處理吧,要知道在移動開發中,內存是相當寶貴的,而且一張100K的圖片,加載完所佔用的內存何止100K?

經過研究,發現,Options中有個屬性inJustDecodeBounds,研究了一下,終於明白是什麼意思了,SDK中的E文是這麼說的

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.
(大概意思, 如果設置成TRUE, decoder將返回NULL值, 不過可以得到outHeight,outWidth等屬性, 在不加載bitmap到內在的情況下我們可以查詢這些屬性)

那麼相應的方法也就出來了,通過設置inJustDecodeBounds爲true,獲取到outHeight(圖片原始高度)和outWidth(圖片的原始寬度),然後計算一個inSampleSize(縮放值),然後就可以取圖片了,這裏要注意的是,inSampleSize可能小於1,必須做判斷,同時由於inSampleSize爲Int類型,而圖片的高度和寬度也爲int類型,通過精度的轉換,可能會存在失真的問題,那麼,我這樣進行那個判斷(實例代碼中爲取高度爲200PX的縮略圖)

     int be = options.outHeight / 20;//應該直接除200的,但這裏出20是爲了增加一位數的精度 
      if(be%10 !=0) 
     be+=10; //儘量取大點圖片,否則會模糊 
      be=be/10; 
     if (be <= 0) //判斷200是否超過原始圖片高度 
      be = 1; //如果超過,則不進行縮放 
      options.inSampleSize = be; 


整體代碼如下

    BitmapFactory.Options options = new BitmapFactory.Options(); 
        //options.inSampleSize = 3; 
          options.outHeight = 200; 
          options.inJustDecodeBounds = true; 
       // options. 
          if (position < 0) { 

          position = position + mImageDirs.size(); 

         } 
      // 獲取這個圖片的寬和高 
     Bitmap bm = BitmapFactory.decodeFile(path,options); //此時返回bm爲空 
           options.inJustDecodeBounds = false; 
         int be = options.outHeight / 20; 
         if(be%10 !=0) 
         be+=10; 
         be=be/10; 
         if (be <= 0) 
         be = 1; 
         options.inSampleSize = be; 
         bm = BitmapFactory.decodeFile(path,options); 

         i.setImageBitmap(bm); 


 按長寬各自比縮放,代碼片段如下

        int bmpWidth  = bitmap.getWidth();  

        int bmpHeight  = bitmap.getHeight();  

        //縮放圖片的尺寸  

         float scaleWidth  = (float) 100 / bmpWidth;     //按固定大小縮放  sWidth 寫多大就多大

         float scaleHeight = (float) 50/ bmpHeight;  //

        Matrix matrix = new Matrix();  

        matrix.postScale(scaleWidth, scaleHeight);//產生縮放後的Bitmap對象  

         Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);  


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章