android圓形圖片裁剪demo以及實現
阿新 • • 發佈:2019-02-02
Bitmap getBitmap() {
try {
// srcPic.getDrawingCache()獲取View截圖在某些情況下報錯了。
// 現在用一種新的獲取view中影象的方法取代getDrawingCache()方法.
// 另:在使用createBitmap()增加try..catch..以防止不斷生成bitmap可能導致的oom
int startX = (int) (clipview.getCircleCenterPX() - clipview.getRadius());
int startY = (int) (clipview .getCircleCenterPY() - clipview.getRadius());
Log.i(TAG, "getBitmap():startX=" + startX
+ ",startY=" + startY
+ ",clipview.getClipWidth()=" + clipview.getClipWidth()
+ ",clipview.getWidth()=" + clipview.getWidth()
+ ",clipview.getCircleCenterPX()=" + clipview.getCircleCenterPX()
+ ",clipview.getRadius()=" + clipview.getRadius()
+ ",clipview.getCircleCenterPY()=" + clipview.getCircleCenterPY());
Bitmap finalBitmap = Bitmap.createBitmap(
loadBitmapFromView(srcPic),
startX, startY, clipview.getClipWidth(),
clipview.getClipHeight());
// 釋放資源
srcPic.destroyDrawingCache();
Log.i(TAG, "getBitmap() finalBitmap=" + finalBitmap);
return getCircleBitmap(finalBitmap);
} catch (OutOfMemoryError err) {
Toast.makeText(this, "儲存頭像失敗", Toast.LENGTH_SHORT).show();
Log.e(TAG, err.getMessage());
return null;
} catch (Exception e) {
Toast.makeText(this, "儲存頭像失敗!", Toast.LENGTH_SHORT).show();
Log.e(TAG, e.getMessage());
return null;
}
}
/**
* @description 獲取圓形裁剪框內截圖
* @param bitmap src圖片
* @return
*/
public static Bitmap getCircleBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
//在畫布上繪製一個圓 -1是為了去掉白色的邊框
canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
bitmap.getWidth() / 2 - 1, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
Log.i(TAG, "getCircleBitmap() output=" + output);
return output;
}