Android 使用 Canvas 和 Paint 实现圆角图片

学习笔记

效果展示:

全部代码:

public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding = ActivityYuanBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 设置返回按钮的点击事件,点击时跳转到 MainActivitybinding.fanhuiYuan.setOnClickListener(v -> {Intent intent = new Intent(YuanActivity.this, MainActivity.class);startActivity(intent);});// 加载原始图片(从资源文件加载)Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.userphoto);// 获取圆形裁剪后的图片,这里 500 是圆角的半径Bitmap roundedBitmap = getRoundedCornerBitmap(bitmap, 500);// 设置 ImageView 显示圆形裁剪后的图片binding.yuanjiaophotoYuan.setImageBitmap(roundedBitmap);}/*** 将原始 Bitmap 转换为圆角图片(这里实际是圆形图片)** @param bitmap 原始图片* @param radius 圆角半径* @return 圆角(圆形)图片*/private Bitmap getRoundedCornerBitmap(Bitmap bitmap, float radius) {// 获取原始图片的宽高int width = bitmap.getWidth();int height = bitmap.getHeight();// 创建一个新的 Bitmap,用于保存圆角效果的图像// 使用 ARGB_8888 配置,支持透明度,效果较好Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个 Canvas 对象,用于在新 Bitmap 上绘制Canvas canvas = new Canvas(output);// 创建 Paint 对象,设置绘制样式Paint paint = new Paint();paint.setAntiAlias(true); // 启用抗锯齿,以确保绘制出来的圆角平滑paint.setFilterBitmap(true); // 启用图像过滤,提高图像质量paint.setDither(true); // 启用抖动,使图像颜色更平滑paint.setColor(Color.BLACK); // 设置画笔颜色为黑色// 创建一个矩形区域,作为圆角矩形的边界RectF rectF = new RectF(0, 0, width, height);// 绘制一个圆角矩形(实际绘制的是一个圆形矩形)// 这里的 radius 就是圆角的半径,设置为较大的值会形成圆形效果canvas.drawRoundRect(rectF, radius, radius, paint);// 设置 Xfermode(混合模式),使得图片绘制在圆角矩形内// SRC_IN 表示仅保留矩形与原图片交集部分的内容,超出部分透明paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));// 将原始图片绘制到圆角矩形区域内canvas.drawBitmap(bitmap, 0, 0, paint);// 返回处理后的圆角图片return output;}
}

学习笔记:使用 CanvasPaint 实现圆角图片

在 Android 中,CanvasPaint 是用于图形绘制的基础类,利用这两者可以对图片进行各种裁剪和样式处理。实现圆角图片的关键是对原始图片进行裁剪,使其边角变圆。通过绘制一个圆角矩形,将图片内容限制在这个矩形内,即可实现圆角效果。

基本概念
  • Canvas:用于绘制图形的画布,可以用来绘制矩形、圆形、图片等内容。
  • Paint:控制绘制的样式,包括颜色、线条宽度、抗锯齿等。
  • Bitmap:位图对象,表示图片的数据,可以对其进行操作(例如裁剪、旋转等)。

步骤说明:实现圆角图片

1. 创建新的 Bitmap

为了将原图裁剪为圆角图像,首先需要创建一个新的 Bitmap,它的宽度和高度与原图相同,并且格式为 ARGB_8888,以保证图片质量。

2. 绘制圆角矩形

使用 CanvasPaint 绘制一个圆角矩形。圆角的半径通过传入的参数来控制,矩形的大小与原始图片相同。

3. 使用 Xfermode 实现图像裁剪

Xfermode 控制图形的混合模式。在这里,使用 PorterDuff.Mode.SRC_IN 可以确保图片只绘制在圆角矩形区域内,其他部分会变成透明。

4. 将原始图片绘制到圆角区域

最后,我们将原始图片绘制到上面创建的圆角矩形区域,从而实现圆角效果。


代码实现:

 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = findViewById(R.id.imageView);// 加载原始图片Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);// 获取圆角裁剪后的图片Bitmap roundedBitmap = getRoundedCornerBitmap(bitmap, 30); // 30是圆角的半径// 显示圆角图片imageView.setImageBitmap(roundedBitmap);}/*** 将 Bitmap 转换为圆角图片** @param bitmap 原始图片* @param radius 圆角半径* @return 圆角图片*/private Bitmap getRoundedCornerBitmap(Bitmap bitmap, float radius) {// 获取图片的宽高int width = bitmap.getWidth();int height = bitmap.getHeight();// 创建一个新的 Bitmap,用于保存圆角效果Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个 Canvas 用来绘制圆角图像Canvas canvas = new Canvas(output);// 创建一个 Paint 对象Paint paint = new Paint();paint.setAntiAlias(true); // 抗锯齿paint.setFilterBitmap(true); // 使用过滤器paint.setDither(true); // 使用抖动paint.setColor(Color.BLACK); // 设置画笔颜色为黑色// 创建一个矩形,作为圆角矩形的边界RectF rectF = new RectF(0, 0, width, height);// 绘制圆角矩形canvas.drawRoundRect(rectF, radius, radius, paint);// 设置 Xfermode 使图像绘制在圆角矩形区域内paint.setXfermode(new android.graphics.PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));// 绘制原始图片canvas.drawBitmap(bitmap, 0, 0, paint);return output;}
}

代码分析:

  1. 加载原图

     
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);
    

  2. 创建一个新的 Bitmap 用于绘制

     
    Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    

  3. 创建 Canvas 和 Paint 对象

     
    Canvas canvas = new Canvas(output);
    Paint paint = new Paint();
    paint.setAntiAlias(true); // 启用抗锯齿
    paint.setColor(Color.BLACK); // 设置画笔颜色
    

    Canvas 用于在 output 图像上绘制内容,Paint 设置绘制的风格。

  4. 绘制圆角矩形

     
    RectF rectF = new RectF(0, 0, width, height);
    canvas.drawRoundRect(rectF, radius, radius, paint);
    

    使用 drawRoundRect 方法绘制一个圆角矩形,radius 控制圆角的半径。

  5. 设置 Xfermode

     
    paint.setXfermode(new android.graphics.PorterDuffXfermode(android.graphics.PorterDuff.Mode.SRC_IN));
    

    设置 Xfermode,只让图像在圆角矩形内显示。SRC_IN 模式会保留原始图像和绘制区域的交集部分。

  6. 绘制原图像

     
    canvas.drawBitmap(bitmap, 0, 0, paint);
    

    将原图绘制到新的图像区域。


圆角半径控制:

  • radius 参数控制圆角的半径。较小的 radius 适合轻微的圆角效果,而较大的 radius 会让图像角落更加圆润。

总结:

  • 使用 CanvasPaint 来绘制圆角图片的主要思路是:首先绘制一个圆角矩形,然后将原图绘制到矩形区域中,通过 Xfermode 保证只显示矩形区域的部分,从而达到圆角效果。
  • 这种方法适用于简单的圆角效果,但如果你需要更复杂的图片处理(例如圆形裁剪、圆角加阴影等),可以进一步扩展使用。

复习要点:

  1. Canvas:绘制图形的工具。
  2. Paint:控制图形绘制样式(例如颜色、抗锯齿等)。
  3. Xfermode:控制图形绘制的混合模式。
  4. PorterDuff.Mode.SRC_IN:绘制交集部分的模式,常用于裁剪图像。
  5. 圆角半径控制:根据需求调整圆角效果的大小。

通过这篇笔记,可以更好地理解如何通过 Android 的绘图工具来实现常见的图像效果,如圆角图片裁剪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式 —— 【创建型模式】建造者模式详解

文章目录 一、建造者模式二、案例实现三、优缺点四、模式拓展五、对比1、工厂方法模式VS建造者模式2、抽象工厂模式VS建造者模式 一、建造者模式 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过…

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history(历史记录&a…

redis数据结构和内部编码及单线程架构

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …

旅游管理系统的设计与实现

文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:旅游管理系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候&#…

AIGC 与艺术创作:机遇

目录 一.AIGC 的崛起与艺术领域的变革 二.AIGC 在不同艺术形式中的应用 1.绘画与视觉艺术 2.音乐创作 三.AIGC 为艺术创作带来的机遇 1.激发创意灵感 2.提高创作效率 总结 在当今数字化时代,人工智能生成内容(AIGC)正以惊人的速度重塑…

Linux下的编程

实验7 Linux下的编程 一、实验目的 熟练掌握Linux下Python编程的方法、函数调用方法以及shell编程中的控制结构。 二、实验环境 硬件:PC电脑一台,网络正常。 配置:win10系统,内存大于8G ,硬盘500G及以上。 软件&a…

「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果

本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色,用户可以在视觉上感受到按钮的闪烁效果,提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能&#xf…

智能安全新时代:大语言模型与智能体在网络安全中的革命性应用

一、引言 随着信息技术的飞速发展,网络安全问题日益严重,成为各行各业面临的重大挑战。传统的安全防护措施已难以应对日益复杂的网络威胁,人工智能(AI)技术的引入为网络安全带来了新的希望。特别是大语言模型&#xff…

深度学习(2)前向传播与反向传播

这一次我们重点讲解前向传播与反向传播,对这里还是有点糊涂 前向传播(Forward Propagation)和反向传播(Backward Propagation)是深度学习中神经网络训练的核心过程。它们分别负责计算神经网络的输出以及更新神经网络的…

数据结构——图(遍历,最小生成树,最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…

SSM报错:表现层方法应该返回字符串,但是返回页面

在进行SSM项目时,后端表现层应该返回给前端字符串,但是却跳转页面 1.首先检查是否使用ResponseBody注解 ResponseBody注解 作用:将java对象转为json格式的数据。将controller的方法返回的对象通过适当的转换器转换为指定的格式之后&#xff0…

【openGL入门(一)】

openGL入门(一) OpenGL(Open Graphics Library)GLAD & GLFW通过代码片段滤清流程1. 画面绘制基础2.VAO,VBO,EBO(1) VAO : Vertex Array Object(2) VBO: Vertex Buffer ObjectEBO:Element Buffer Object 总结 OpenG…

DAY2 C++基础补充

作业1: 已知一个数组table,用宏定义求出数组元素的个数。 #define NUM sizeof(table)/sizeof(table[0]) 作业2: 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第…

图像滤波和卷积的不同及MATLAB应用实例

滤波与卷积在图像处理中都是非常重要的运算,但它们有着明显的区别。以下是滤波与卷积的主要不同点,并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的: 1)滤波:滤波是一种信…

SpringBoot整合knife4j,以及会遇到的一些bug

这篇文章主要讲解了“Spring Boot集成接口管理工具Knife4j怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot集成接口管理工具Knife4j怎么用”吧! 一…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计(SOH预测)1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好,年轻的学徒!🧑‍💻 是时候踏上进入Java开发世界的史诗之旅了,我们的得力助手将是强大的IntelliJ IDEA。准备好了吗?出发吧! 在我们开始之前,我们需要下载这个工具。但是&#…

Burp入门(7)-APP抓包

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:burpsuite(5)web网页端抓包与app渗透测试_哔哩哔哩_bilibili 本文详细介绍如何使用burp suite去抓取APP的数据包。 一、安装 Burp 的 CA 证书 1…

【AI+网络/仿真数据集】1分钟搭建云原生端到端5G网络

导语: 近期智慧网络开放创新平台上线了端到端网络仿真能力,区别于传统的网络仿真工具需要复杂的领域知识可界面操作,该平台的网络仿真能力主打一个小白友好和功能专业。 https://jiutian.10086.cn/open/​jiutian.10086.cn/open/ 端到端仿…

学习实验室—招投标实务

在如今业务为王的市场竞争中,招投标的成功率不仅仅取决于方案的质量,更多的是一些“隐形”的诀窍和经验。许多成功的背后,往往隐藏着那些别人不愿提及的细节与技巧。突破盲点,往往意味着“知道与不知道”的差距。 今天&#xff0…