android圖片裁剪截取中間正方形部分

sltr3559 8年前發布 | 15K 次閱讀 Android開發 移動開發

 在做相冊應用的過程中,需要得到一個壓縮過的縮略圖但,同時我還希望得到的bitmap能夠是正方形的,以適應正方形的imageView,傳統設置inSampleSize壓縮比率的方式只是壓縮了整張圖片,如果一個圖片的長寬差距較大,則展示出來的時候會有拉伸的現象,因此正確的做法是在壓縮之后,對bitmap進行裁剪。

代碼如下:

給定圖片維持寬高比縮放后,截取正中間的正方形部分

/**

   * @param bitmap      原圖
   * @param edgeLength  希望得到的正方形部分的邊長
   * @return  縮放截取正中部分后的位圖。
   */
  public static Bitmap centerSquareScaleBitmap(Bitmap bitmap, int edgeLength)
  {
   if(null == bitmap || edgeLength <= 0)
   {
    return  null;
   }

   Bitmap result = bitmap;
   int widthOrg = bitmap.getWidth();
   int heightOrg = bitmap.getHeight();

   if(widthOrg > edgeLength && heightOrg > edgeLength)
   {
    //壓縮到一個最小長度是edgeLength的bitmap
    int longerEdge = (int)(edgeLength * Math.max(widthOrg, heightOrg) / Math.min(widthOrg, heightOrg));
    int scaledWidth = widthOrg > heightOrg ? longerEdge : edgeLength;
    int scaledHeight = widthOrg > heightOrg ? edgeLength : longerEdge;
    Bitmap scaledBitmap;

          try{
           scaledBitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true);
          }
          catch(Exception e){
           return null;
          }

       //從圖中截取正中間的正方形部分。
       int xTopLeft = (scaledWidth - edgeLength) / 2;
       int yTopLeft = (scaledHeight - edgeLength) / 2;

       try{
        result = Bitmap.createBitmap(scaledBitmap, xTopLeft, yTopLeft, edgeLength, edgeLength);
        scaledBitmap.recycle();
       }
       catch(Exception e){
        return null;
       }       
   }

   return result;
  }

需要注的是bitmap參數一定要是從原圖得到的,如果是已經經過BitmapFactory inSampleSize壓縮過的,可能會不是到正方形。

 本文由用戶 sltr3559 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!