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

作者:牧秦丶 时间:2021-08-12 16:14:12 

在 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 实现图片生成卷角和圆角缩略图的方法

来源:http://www.jianshu.com/p/481b556895a1

标签:Android,缩略图
0
投稿

猜你喜欢

  • SpringBoot3.0整合chatGPT的完整步骤

    2023-01-29 01:34:36
  • Mybatis Limit实现分页功能

    2022-03-14 13:57:57
  • SpringBoot集成支付宝沙箱支付(支付、退款)

    2022-02-15 16:50:52
  • RestTemplate Get请求实现bean参数传递详解

    2022-03-14 22:20:27
  • Java KindEditor粘贴图片自动上传到服务器功能实现

    2023-08-07 01:42:33
  • Android TextView实现跑马灯效果的方法

    2023-07-30 20:44:12
  • Java线程安全中的有序性浅析

    2023-07-12 03:07:58
  • 一篇文章带你深入了解javaIO基础

    2022-10-22 21:43:05
  • Spring Boot支持Crontab任务改造的方法

    2023-08-08 20:20:24
  • 如何解决@NotBlank不生效的问题

    2022-04-01 13:41:08
  • MyBatis中的连接池及事物控制配置过程

    2022-05-17 05:00:40
  • Android实现EditText控件禁止输入内容的方法(附测试demo)

    2021-06-26 08:43:38
  • Java解析使用JSON的多种方法

    2022-08-13 00:18:01
  • 基于ArrayList源码解析(基于JDK1.8)

    2021-10-07 18:34:25
  • 基于Mybatis映射的一点心得(分享)

    2023-08-08 13:15:53
  • SpringBoot整合Web之AOP配置详解

    2022-01-17 21:38:11
  • C#字符串和Acsii码相互转换

    2022-09-24 00:12:07
  • C#实现Windows Form调用R进行绘图与显示的方法

    2021-11-29 05:40:13
  • Spring Data JPA 之 JpaRepository的使用

    2023-11-24 21:23:40
  • View触发机制API实现GestureDetector OverScroller详解

    2023-01-24 00:57:08
  • asp之家 软件编程 m.aspxhome.com