感觉也没什么好说的,直接上代码,都有注释,应该能看得懂吧,自己也在这里记录一下!
主要是对Paint Xfermode的运用:
/**
* 创建圆形头像
*
* @param img
* @return
*/
public static Bitmap createRoundIcon(Bitmap img) {
if (img == null) {
return null;
}
// 原图大小
int imgWidth = img.getWidth();
int imgHeight = img.getHeight();
// 生成圆形图像大小
int imgSize = Math.min(imgWidth, imgHeight);
// 绘制图片的起始位置
float left = (imgSize - imgWidth) / 2.0F;
float right = (imgSize - imgHeight) / 2.0F;
// 填充边距
int padding = 2;
// 图像半径
int r = imgSize / 2;
// 1.创建新图
Bitmap ret = Bitmap.createBitmap(imgSize, imgSize, Config.ARGB_8888);
Canvas c = new Canvas(ret);
Paint p = new Paint();
p.setAntiAlias(true);
// 2.绘制圆形头像
p.setColor(Color.WHITE);
c.drawCircle(r, r, r - padding, p);
p.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
c.drawBitmap(img, left, right, p);
// 3.绘制边框
p.setXfermode(new PorterDuffXfermode(Mode.DST_OVER));
c.drawCircle(r, r, r, p);
return ret;
}
==========================================================================
增加几种生成圆形图片的方法:
主要是对ShapeDrawable,BitmapShader的运用:
/**
* 生成圆形图片<BR>
* 如果图片大于或小于size,通过缩放源图到size大小,并生成圆形图片
* @param bitmap 源图
* @param size 生成图片大小
* @return 返回圆形图片
*/
public Bitmap createRoundBitmapByScale(Bitmap bitmap, int size) {
if (bitmap == null) {
return null;
}
Bitmap src = Bitmap.createScaledBitmap(bitmap, size, size, true);
return createRoundBitmap(src, size);
}
/**
* 生成圆形图片<BR>
* 如果图片大于size,通过截取源图中心部分size大小,并生成圆形图片<BR>
* 如果图片小于size,通过创建一张size大小的图片将源图画在其中心位置,并生成图形图片
* @param bitmap 源图
* @param size 生成图片大小
* @return 返回圆形图片
*/
public Bitmap createRoundBitmapByClip(Bitmap bitmap, int size) {
if (bitmap == null) {
return null;
}
Bitmap src = null;
int imgW = bitmap.getWidth();
int imgH = bitmap.getHeight();
int x = (imgW - size) / 2;
int y = (imgH - size) / 2;
if (x < 0 || y < 0) {// too small
src = Bitmap.createBitmap(size, size, Config.ARGB_8888);
Canvas c = new Canvas(src);
c.drawBitmap(bitmap, -x, -y, new Paint(Paint.ANTI_ALIAS_FLAG));
} else {
src = Bitmap.createBitmap(bitmap, x, y, size, size);
}
return createRoundBitmap(src, size);
}
/**
* 生成圆形图片<BR>
* 原理:<BR>
* 1.生成size大小的圆形图片<BR>
* 2.从左上角绘制源图<BR>
* 结果:<BR>
* 如果图片大于size,取图片的左上部分生成圆形图片<BR>
* 如果图片小于size,生成圆形图片只占居左上部分
* @param bitmap 源图
* @param size 生成图片大小
* @return 返回圆形图片
*/
public Bitmap createRoundBitmap(Bitmap bitmap, int size) {
if (bitmap == null) {
return null;
}
// create round drawable
ShapeDrawable sd = new ShapeDrawable(new OvalShape());
sd.setBounds(0, 0, size, size);
Paint p = sd.getPaint();
p.setShader(new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP));
// draw to bitmap
Bitmap ret = Bitmap.createBitmap(size, size, Config.ARGB_8888);
Canvas c = new Canvas(ret);
sd.draw(c);
return ret;
}
补充:
也可以使用support.v4中的 RoundedBitmapDrawable:
RoundedBitmapDrawable dw = RoundedBitmapDrawableFactory.create(getResources(), 图片);
dw.setCornerRadius(圆形图片半径);
dw.setBounds(0, 0, 圆形图片大小, 圆形图片大小);
dw.draw(c);