转发https://blog.csdn.net/yangyahuiguo/article/details/52253401?utm_source=blogxgwz2
1.中央截取正方形,可设置圆角
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.testimg);
//设置bitmap.getWidth()可以获得圆形
Bitmap bitmap1 = ClipSquareBitmap(bitmap,200,bitmap.getWidth());
imageView.setImageBitmap(bitmap1);
public static Bitmap ClipSquareBitmap(Bitmap bmp, int width, int radius) {
if (bmp == null || width <= 0)
return null;
//如果图片比较小就没必要进行缩放了
/**
* 把图片进行缩放,以宽高最小的一边为准,缩放图片比例
* */
if (bmp.getWidth() > width && bmp.getHeight() > width) {
if (bmp.getWidth() > bmp.getHeight()) {
bmp = Bitmap.createScaledBitmap(bmp, (int) (((float) width) * bmp.getWidth() / bmp.getHeight()), width, false);
} else {
bmp = Bitmap.createScaledBitmap(bmp, width, (int) (((float) width) * bmp.getHeight() / bmp.getWidth()), false);
}
} else {
width = bmp.getWidth() > bmp.getHeight() ? bmp.getHeight() : bmp.getWidth();
Log.d("zeyu","宽" + width + ",w" + bmp.getWidth() + ",h" + bmp.getHeight());
if (radius > width) {
radius = width;
}
}
Bitmap output = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
//设置画笔全透明
canvas.drawARGB(0, 0, 0, 0);
Paint paints = new Paint();
paints.setColor(Color.WHITE);
paints.setAntiAlias(true);//去锯齿
paints.setFilterBitmap(true);
//防抖动
paints.setDither(true);
//把图片圆形绘制矩形
if (radius <= 0)
canvas.drawRect(new Rect(0, 0, width, width), paints);
else //绘制圆角
canvas.drawRoundRect(new RectF(0, 0, width, width), radius, radius, paints);
// 取两层绘制交集。显示前景色。
paints.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Rect rect = new Rect();
if (bmp.getWidth() >= bmp.getHeight()) {
rect.set((bmp.getWidth() - width) / 2, 0, (bmp.getWidth() + width) / 2, width);
} else {
rect.set(0, (bmp.getHeight() - width) / 2, width, (bmp.getHeight() + width) / 2);
}
Rect rect2 = new Rect(0, 0, width, width);
//第一个rect 针对bmp的绘制区域,rect2表示绘制到上面位置
canvas.drawBitmap(bmp, rect, rect2, paints);
bmp.recycle();
return output;
}
2.这种方式也可获得圆形,但是不是以中央为圆心切的,图像偏上方
public static Bitmap circleBitmap(Bitmap source) {
int width = source.getWidth();
Bitmap bitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawCircle(width / 2, width / 2, width / 2, paint);
//设置图片相交情况下的处理方式
//setXfermode:设置当绘制的图像出现相交情况时候的处理方式的,它包含的常用模式有:
//PorterDuff.Mode.SRC_IN 取两层图像交集部分,只显示上层图像
//PorterDuff.Mode.DST_IN 取两层图像交集部分,只显示下层图像
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return bitmap;
}