首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 圖片裁剪變圓形後過小:正確縮放與繪製方案

     編輯:程式設計疑難解答

問題分析

系統裁剪輸出尺寸由 outputX/outputY 決定,若直接用該 Bitmap 繪製圓形,半徑受限於較小邊,導致圓形比預期小。

解決思路

  1. 先將裁剪後的圖片按目標控件大小縮放(保持比例)
  2. 以目標控件寬高較小值為直徑創建畫布
  3. 居中繪製縮放後的圖片,再用 PorterDuffXfermode(SRC_IN) 取交集形成圓形

關鍵代碼

public static Bitmap cut2Circular(Bitmap source, boolean recycleSource) {
    int targetW = layoutPhoto.getWidth() - dip2px(10);
    int targetH = layoutPhoto.getHeight() - dip2px(10);
    // 縮放
    Matrix mx = new Matrix();
    mx.postScale((float)targetW/source.getWidth(), (float)targetH/source.getHeight());
    source = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), mx, true);
    // 繪製圓形
    int diameter = Math.min(targetW, targetH);
    Bitmap result = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(result);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    canvas.drawCircle(diameter/2, diameter/2, diameter/2, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(source, (diameter-targetW)/2, (diameter-targetH)/2, paint);
    if (recycleSource) source.recycle();
    return result;
}

注意

及時 recycle() 釋放中間 Bitmap,防止 OOM。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved