PorterDuffXfermode的理解

来源:互联网 发布:招商银行网络银行 编辑:程序博客网 时间:2024/05/16 21:30




这张图片大家不陌生吧,网络上解释也一大堆,都是不经大脑的疯传。


public Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
// 比较初始Bitmap宽高和给定的圆形直径,判断是否需要缩放裁剪Bitmap对象
if (bmp.getWidth() != radius || bmp.getHeight() != radius)
sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
else
sbmp = bmp;




Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
Config.ARGB_8888);


Canvas canvas = new Canvas(output);


final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());


paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));


canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);


// 核心部分,设置两张图片的相交模式,在这里就是上面绘制的Circle和下面绘制的Bitmap
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));


canvas.drawBitmap(sbmp, rect, rect, paint);



return output;
}


根据解释SRC_IN是  取两层绘制交集。显示上层。所以最终得到的是一个圆形图片。好,这个解释可以通过


那我们换一下代码,

canvas.drawBitmap(sbmp, rect, rect, paint);


paint.setXfermode(new PorterDuffXfermode(
Mode.DST_IN));

canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);


根据解释说DST_IN是取两层绘制交集,显示下层。但是最后显示的却不是一张圆形图片,这个是为什么呢?



因为非drawBitmap都是直接在构造在Canvas的Bitmap区域内,并没有两层效果,所以第2种写法,最后显示的还是一张图片。第一种虽然没有两层,但是Canvas的构造区域就是一个圆形,因为是先画圆,我个人理解是这样的,期待大神有更好的解释。


http://e.hiphotos.baidu.com/zhidao/pic/item/c995d143ad4bd1133f5619e35cafa40f4afb0543.jpg?qq-pf-to=pcqq.c2c


0 0