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

学习笔记

效果展示:

全部代码:

public class YuanActivity extends AppCompatActivity {

    private ActivityYuanBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 通过 DataBinding 获取布局文件
        binding = ActivityYuanBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // 设置返回按钮的点击事件,点击时跳转到 MainActivity
        binding.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;

    @Override
    protected 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 的绘图工具来实现常见的图像效果,如圆角图片裁剪。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌控时间,成就更好的自己

在个人成长的道路上,时间管理是至关重要的一环。有效的时间管理能够让我们更加高效地完成任务,实现自己的目标,不断提升自我。 时间对每个人都是公平的,一天只有 24 小时。然而,为什么有些人能够在有限的时间里做出卓…

flask-socketio相关总结

flask-socketio是一个为flask应用程序添加的实时双向通信功能的扩展库,有了这个库,就可以在flask应用中应用websocket协议,帮助flask实现低延迟、双向的客户端、服务端通信。客户端通过任何SocketIO官方库,都能与服务器建立长连接…

YOLOv8改进,YOLOv8引入CARAFE轻量级通用上采样算子,助力模型涨点

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…

如何把阿里云ECS里的文件下载到本地(免登录免配置)

如何把阿里云ECS里的文件下载到本地(免登录免配置) 作为一个阿里云ECS的用户,Up时长会遇到希望把ECS里的文件下载到自己的个人电脑,然后在自己的电脑里面查看,保存或者发送给别人。最近发现阿里云新上了一个功能&…

【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色&#xf…

【Axios】如何在Vue中使用Axios请求拦截器

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

在服务器上实现本地python文件的依赖

1、在python中,一个python文件就可以视为一个模块进行导入 2、使用import 导入时,若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

emacs 折腾日记(一)——序言

初次知道emacs这个东西是在《程序员的呐喊》这本书。书中的作者提倡学习编译原理,推崇emacs。现在距离我知道emacs已经过去了快8年,期间不断的重复学习——放弃——学习的路子。与过去学习vim类似,vim我也经历过放弃到学习,最后有…

【二分查找】力扣 875. 爱吃香蕉的珂珂

一、题目 二、思路 速度 k(单位:根/小时)是存在一个取值范围的。 速度越大肯定在规定的时间之内一定会吃完全部的香蕉,但也是可以确定出一个上界的。由于只要保证一小时之内,可以吃完香蕉数目最多的那一堆的香蕉&…

如何找到你的决定性优势

在任何高风险竞争中,无论是争取客户还是发展职业生涯,拥有决定性优势至关重要。沃伦巴菲特称之为“持久竞争优势”,迈克尔波特将其称为“竞争优势”。无论名称如何,核心理念是相同的: 永远不要参与你没有绝对优势的竞争…

【JavaWeb后端学习笔记】SpringBoot框架下Http请求参数接收

Http请求参数接收 1、简单参数2、实体参数3、数组参数4、集合参数5、日期参数6、Json格式参数(常用)7、路径参数(常用)8、接收请求参数常用的几个注解 Http请求能携带各种格式的请求参数。因此也就需要不同的接收方式。 1、简单参…

Qt6.8 QGraphicsView鼠标坐标点偏差

ui文件拖放QGraphicsView,src文件定义QGraphicsScene赋值给图形视图。 this->scene new QGraphicsScene();ui.graph->setScene(this->scene);对graphicview过滤事件,只能在其viewport之后安装,否则不响应。 ui.graph->viewport…

macmini安装ubuntu网卡驱动BCM4360

安装成功效果如下 成功连接wifi 成功分配到IP 执行命令如下 1. sudo apt update 2. sudo apt install broadcom-sta-dkms 3. 重启电脑

网络测速工具

1. SPEEDTEST https://www.speedtest.net/ 2. 测速网 测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测速, 物联网监测,Wi-Fi 7,Wi-Fi 6,FTTR,全屋Wi-Fi - SpeedTest.cn 3. 字节比特换算 bps(bits per second) 字节和比特的换算…

docker安装victoriametrics

docker安装victoriametrics 1、单机版安装2、victoriametrics增删改查2.1 、插入数据2.1.1 组装数据插入victoriametrics(java代码插入)2.1.2 Prometheus数据插入victoriametrics2.1.3 官网push到victoriametrics写法 2.2 、查询2.2.1 、Instant query(即时查询&…

用ZipOutputStream生成的zip压缩包无法用WinRAR软件进行解压

1、问题 用WinRAR软件无法解压用ZipOutputStream生成的zip压缩包,而用360压缩就可以解压 2、原因 流没有正常关闭 3、解决办法 可以使用try-with-resources来自动关闭ZipOutputStream 例: public void compressedFile(String businessId, HttpServle…

WEB_星河飞雪_Windows(全)

Windows基础 这一节就主要将一些Windows的一些基础命令。 文件系统及其简述管理机制 首先linux操作系统有一个核心的概念就是——在linux中一切都是文件,几乎很多重要的东西都挂在根目录下(“/”),它采用的是fhs目录结构( File…

人工智能中的深度学习:原理与实践

什么是深度学习? 深度学习(Deep Learning)是机器学习的一个分支,旨在通过模拟人脑的神经网络结构来解决复杂的任务。深度学习通过多层神经网络,自动从数据中学习特征,避免了传统机器学习中手动特征工程的繁…

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …

Java 初学者的第一个 SpringBoot 系统

Java 初学者的第一个 SpringBoot 系统 对编程初学者而言&#xff0c;都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”&#xff0c;他们即使再努力也没有办法了解完整的系统&#xff0c;即使他们把教科书里的所有程序都跑通了。但是&#xff0c;面对…