Android 实现图片生成卷角和圆角缩略图的方法
作者:牧秦丶 发布时间:2021-08-12 16:14:12
标签:Android,缩略图
在 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 交叠时像素的处理方式,其作用用一幅图片展示如下:
我们看出 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);
做出的效果如下:
2、带 “卷角+圆角” 的缩略图:
有时候,我们需要为一张普通的图片生成 “卷角+圆角” 效果的图,像这样:
这时候,我们可以用两张辅助图来实现这个效果,一张底图做掩码,得到 “圆角+左上角切角” 的效果,然后用另一张图片覆盖在上面,得到 “灰色边框+右上角卷角” 的效果,我们需要的两张图如下:
代码如下:
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 图片的问题,不是方法的问题):
来源:http://www.jianshu.com/p/481b556895a1


猜你喜欢
- 将字母全部转换为大写或小写,在C#编程中是一个非常常见的功能。在开发过程中,经常需要验证用户登录,用户在输入用户名时可能不区分大小写,如果我
- 本文实例讲述了C#操作PowerPoint的方法。分享给大家供大家参考。具体如下:这里C#操作PowerPoint的基本代码,包括打开ppt
- ArrayList与Array的区别概述 ArrayList 是数
- @Value注解设置默认值在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值
- 回想一下MyBatis的基本操作,它需要实体类,自定义mapper接口以及mapper.xml配置文件。为了避免繁琐的工作量,MyBatis
- 1.概述在本快速教程中,我们将学习如何设置Spring Security LDAP。在我们开始之前,了解一下LDAP是什么? - 它代表轻量
- 本文实例为大家分享了android多媒体音乐播放器的具体实现代码,供大家参考,具体内容如下首先,在AndroidManifest.xml中配
- 概念Java中的集合就是一种容器,可以容纳不同种类的数据,这些容纳是建立在未知的基础上。优点1.可以动态保存任意多个对象,使用比较方便。2.
- 在使用C#进行桌面应用开发中,经常会有对文件进行操作的情况,这时可能会需要对文件夹进行文件扫描,获取所有文件做法如下/// <summ
- 在Android Studio中,你可以很快速的使用Parcelable插件进行实体类的序列化的实现,使用该插件后,你的实体类可以快速的实现
- 前言:sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中
- 本文实例为大家分享了android实现密码框右侧显示小眼睛的具体代码,供大家参考,具体内容如下实现效果<?xml version=&q
- 前言我们有时候在开发中,遇到这样的问题,就是我们需要小程序授权登录我们自己的后台,通过小程序的信息换取我们自己后台的token,实现账号密码
- 前言 安卓系统中,Button是程序和用户进行交互的一个重要控件,今天我们就来简单的对Button进行学习,其中Bu
- 前言最近在学习使用 React Native开发,iOS搞完,开始适配安卓,由于木有接触过安卓,所以碰到了很多问题,第一个问题,安卓的返回键
- 数据适配DataAdapter 对象是DataSet 和数据源之间的桥梁,可以建立并初始化数据表(即DataTable),对数据源执行SQL
- 一、ProgressBar1. 常用类型1.1 不确定式圆形进度条style="@android:style/Widget.Hol
- 一、简介   Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布
- 前言:由于最近有解析协议的一些业务场景,需要用到一些字节操作工具,这里封装了一些比较常用的转换方法,测试后基本没有问题,可能一些比较偏门的数
- 大多数情况下你不需要访问者模式,但当一旦需要访问者模式时,那就是真的需要它了,这是设计模式创始人的原话。可以看出应用场景比较少,但需要它的时