欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 实现图片生成卷角和圆角缩略图的方法

程序员文章站 2023-11-04 12:36:46
在 android 的一些界面中,有时候我们需要为一副图片生成大小为 n * n 的缩略图,有时候需要的缩略图特殊一些,比如: 1、带圆角的缩略图: 如果我们需要带圆角...

在 android 的一些界面中,有时候我们需要为一副图片生成大小为 n * n 的缩略图,有时候需要的缩略图特殊一些,比如:

1、带圆角的缩略图:

如果我们需要带圆角的缩略图,但提供的图片是 n * n 的正方形的图片,该怎么办?这时候可以在贴图之前,先利用 paint.setxfermode 方法来设置图片叠加时的混合模式,从而达到目的。一般而言,使用方法如下:

paint paint = new paint();
paint.setxfermode(new porterduffxfermode(porterduff.mode.xxx);
canvas.drawbitmap(srcbmp, rc, rc, paint);

关于 porterduff.mode 的值,确定了 srcbmp 和 dstbmp 交叠时像素的处理方式,其作用用一幅图片展示如下:

Android 实现图片生成卷角和圆角缩略图的方法

我们看出 srcin 这个模式,只保留 srcbmp 和 dstbmp 直接的交集部分,并且只展现 srcbmp 上这部分交集的内容。这个模式适合我们做带圆角的缩略图。我们先在 canvas 上绘制一个实心圆角矩形,其他部分透明,然后用这个模式把缩略图再绘制到 canvas 上即可:

bitmap roundthumbbitmap = bitmap.createbitmap(
  rc.width(), rc.height(), bitmap.config.argb_8888);
canvas canvas = new canvas(roundthumbbitmap);

paint paint = new paint();
paint.setcolor(0xffff0000);  // 任何不透明的颜色均可。(作为掩码色)
paint.setantialias(true);   // 开启抗锯齿,防止圆角毛躁.

// 填充一个圆角矩形.
final float radius = 5.0f;
canvas.drawroundrect(new rectf(rc), radius, radius, paint);

paint.setxfermode(new porterduffxfermode(porterduff.mode.src_in));
canvas.drawbitmap(srcbmp, rc, rc, paint);

做出的效果如下:

Android 实现图片生成卷角和圆角缩略图的方法

2、带 “卷角+圆角” 的缩略图:

有时候,我们需要为一张普通的图片生成 “卷角+圆角” 效果的图,像这样:

Android 实现图片生成卷角和圆角缩略图的方法

这时候,我们可以用两张辅助图来实现这个效果,一张底图做掩码,得到 “圆角+左上角切角” 的效果,然后用另一张图片覆盖在上面,得到 “灰色边框+右上角卷角” 的效果,我们需要的两张图如下:

Android 实现图片生成卷角和圆角缩略图的方法

代码如下:

bitmap rollanglethumbbmp = bitmap.createbitmap(rc.width(), rc.height(), bitmap.config.argb_8888);
canvas canvas = new canvas(rollanglethumbbmp);

bitmap maskbmp = bitmapfactory.decoderesource(context.getresources(), r.drawable.mask);
bitmap borderbmp = ((bitmapdrawable)context.getresources().getdrawable(r.drawable.border)).getbitmap();

paint paint = new paint();
paint.setantialias(true);

// 先贴掩码图.
canvas.drawbitmap(maskbmp, rc, rc, paint);

// 再用 srcin 的模式贴缩略图.
paint.setxfermode(new porterduffxfermode(porterduff.mode.src_in));
canvas.drawbitmap(srcbmp, rc, rc, paint);

// 先取消 xfermode.
paint.setxfermode(null);

// 再贴边框卷角图.
canvas.drawbitmap(borderbmp, rc, rc, paint);

得到的效果如下(看起来有些毛躁,纯属是我切的 mask 和 border 图片的问题,不是方法的问题):

Android 实现图片生成卷角和圆角缩略图的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。