setXfermode之ProterDuffXfermode实现圆角头像

本文探讨了SRC_IN和DST_IN两种图像混合模式,分别介绍了它们的概念、原理和应用。SRC_IN保留源图覆盖目标,而DST_IN则保留源像素在目标上的效果。通过实例展示了如何调整图片尺寸并结合这两种模式进行绘制。
摘要由CSDN通过智能技术生成

SRC_IN

概念

保留覆盖目标图的源图,剩余的皆舍弃

原理

Dst为固定大小的圆,Src为获取的头像

原始实现

只会截取到固定的一小部分圆

@Overrid
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
    Bitmap mDstB = drawDst(W,H);
    canvas.drawBitmap(mDstB,0,0,mPaint);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    Bitmap bm = Bitmap.decodeResource(getResources(),R.mipmap.zc);
    canvas.drawBitmap(bm,0,0,mPaint);
    mPaint.setxfermode(null)
    canvas.restoreToCount(sc);
}
public Bitmap drawDst(int W,int H){
    Bitmap bm = Bitmap.createBitmap(W,H, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bm);
    mPaint.setColor(Color.BLACK);
    canvas.drawCircle(W/2,H/2,W/2,mPaint);
    return bm;
}

在这里插入图片描述

改进后

先对获取的Src进行处理后再绘制(实际应用中不介意,只是了解一下ProterDuffXfermode原理

getNewBitmap()

public Bitmap getNewBitmap(Bitmap bitmap,int newWidth,int newHeight){
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    float scaleWidth = ((float) newWidth) /width;
    float scaleHeight = ((float) newHeight) /height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth,scaleHeight);
    Bitmap newBitmap = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
    return newBitmap;
}

onDraw()

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
    //对于Dst的处理不变
    Bitmap mDstB = drawDst(W,H);
    canvas.drawBitmap(mDstB,0,0,mPaint);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    //将获取的图片再次进行处理后返回
    Bitmap mSrcBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.zc);
    Bitmap bm = getNewBitmap(mSrcBitmap,W,H);
    canvas.drawBitmap(bm,0,0,mPaint);
    mPaint.setXfermode(null);
    canvas.restoreToCount(sc);
}

在这里插入图片描述

DST_IN

概念

保留覆盖源像素的目标像素,丢弃剩余的源像素和目标像素

原理

与SRC_IN相反,将源图和目标图绘制顺序颠倒即可
即先处理图片,再在目标图上画圆

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int sc = canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null,Canvas.ALL_SAVE_FLAG);
    Bitmap mDstB = drawDst(W,H);
    Bitmap mSrcBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.zc);
    Bitmap bm = getNewBitmap(mSrcBitmap,W,H);
    canvas.drawBitmap(bm,0,0,mPaint);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    canvas.drawBitmap(mDstB,0,0,mPaint);
    mPaint.setXfermode(null);
    canvas.restoreToCount(sc);
}

效果

同上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值