原理,通过设置画笔的Mode.SRC_IN将画布上重叠区域以外清除,圆形头像不就是我们的bitmap上在中心位置画一个圆然后两部分重叠的么。
如果不明白请往下看。
下面整张图是需要处理的bitmap,我们在其中心画了一个圆2,这样圆2和bitmap的重叠部分就是圆2.Mode.SRC_IN模式会将1和3部分清除掉。然后只剩下2区域。
2区域就是我们所要的头像。
先贴代码:
public Bitmap toCircleBitmap(Bitmap bitmap, int cr) {}
1,这个函数返回的就是圆角矩形,参数bitmap是要转换的原始bitmap,cr是圆角矩形的四个圆角半径。如果cr设置为0就认为是圆形头像。
圆角矩形的四个圆角半径和正方形边长相等,那这个圆角矩形就是一个特殊的圆角矩形--圆。
2,r=width > height?height/2: width/2;取最小边的一般作为半径。
3, if(cr==0)cr=r;如果cr为0则认为要返回的是圆形。
4,Bitmap backgroundBmp = Bitmap.createBitmap(2*r, 2*r, Config.ARGB_8888); 创建要返回的bitmap.
5, paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 这个函数是将重叠部分以外部分去掉 。
6, canvas.drawRoundRect(rectx, cr, cr, paint); 画圆或者圆角矩阵。
7,canvas.drawBitmap(bitmap, srcRect, detRect, paint); 将bitmap中处于srcRect,的部分画在要返回的backgroundBmp的canvas的detRect位置。
这样canvas上就有两个图形,一个是这句话画的bitmap,一个是上面画的圆角矩阵。这两部分重叠部分就是我们要的头像。因为我们设置paint的模式为清除重叠部分以外部分,所以我们需要的头像以外的部分都是没有重叠的会被清除掉,只剩下我们需要的头像。
返回backgroundBmp即可。