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