关于这个功能已经很多人总结过了,但又有或多或少得小问题
这已经是很简介的代码了,但问题是非正方形图片会明显压缩变形。
public Bitmap toRoundBitmap(Bitmap bitmap) {
//圆形图片宽高
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//正方形的边长
int r = 0;
//取最短边做边长
if(width > height) {
r = height;
} else {
r = width;
}
//构建一个bitmap
Bitmap backgroundBmp = Bitmap.createBitmap(width,
height, Config.ARGB_8888);
//new一个Canvas,在backgroundBmp上画图
Canvas canvas = new Canvas(backgroundBmp);
Paint paint = new Paint();
//设置边缘光滑,去掉锯齿
paint.setAntiAlias(true);
//宽高相等,即正方形
RectF rect = new RectF(0, 0, r, r);
//通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
//且都等于r/2时,画出来的圆角矩形就是圆形
canvas.drawRoundRect(rect, r/2, r/2, paint);
//设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
//canvas将bitmap画在backgroundBmp上
canvas.drawBitmap(bitmap, null, rect, paint);
//返回已经绘画好的backgroundBmp
return backgroundBmp;
}
原文已经讲述的很详细了,多余不再赘述。
原文链接:http://blog.csdn.net/feixiangdexin123087/article/details/42076987
为了优化达到下图效果
在上述代码中加入Bitmap剪切出正方形的功能:
int r = width > height ? height : width;// 裁切后所取的正方形区域边长;
int retX = width > height ? (width - height) / 2 : 0;//基于原图,取正方形左上角x坐标
int retY = width > height ? 0 : (height - width) / 2;
bitmap = Bitmap.createBitmap(bitmap, retX, retY, r, r, null, false);
最终代码如下:
public Bitmap toRoundBitmap(Bitmap bitmap) {
//圆形图片宽高
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//正方形的边长
int r = width > height ? height : width;// 裁切后所取的正方形区域边长;
int retX = width > height ? (width - height) / 2 : 0;//基于原图,取正方形左上角x坐标
int retY = width > height ? 0 : (height - width) / 2;
bitmap = Bitmap.createBitmap(bitmap, retX, retY, r, r, null, false);
//构建一个bitmap
Bitmap backgroundBmp = Bitmap.createBitmap(width,
height, Bitmap.Config.ARGB_8888);
//new一个Canvas,在backgroundBmp上画图
Canvas canvas = new Canvas(backgroundBmp);
Paint paint = new Paint();
//设置边缘光滑,去掉锯齿
paint.setAntiAlias(true);
//宽高相等,即正方形
RectF rect = new RectF(0, 0, r, r);
//通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
//且都等于r/2时,画出来的圆角矩形就是圆形
canvas.drawRoundRect(rect, r/2, r/2, paint);
//设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//canvas将bitmap画在backgroundBmp上
canvas.drawBitmap(bitmap, null, rect, paint);
//返回已经绘画好的backgroundBmp
return backgroundBmp;
}
原文链接:http://www.cnblogs.com/Jessy/archive/2012/02/03/2336787.html