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;}
}

学习笔记:如何实现圆形图片裁剪

概述

本篇学习笔记将讲解如何使用 Android 中的 CanvasPaint 实现圆形图片裁剪的功能。具体实现通过绘制圆形区域并结合 PorterDuff.Mode.SRC_IN 混合模式,将图片裁剪成圆形,并显示在 ImageView 中。

核心概念
  • Canvas:用于绘制图形的画布。所有的绘制操作(如绘制圆形、矩形、图片等)都需要借助 Canvas 对象来进行。
  • Paint:设置绘图样式(如颜色、字体、抗锯齿等)的对象。在绘制时,Paint 控制着图形的样式和外观。
  • PorterDuffXfermode:图像合成模式,控制绘制多个图形时的合成方式。SRC_IN 模式让图像仅在两个区域重叠的地方显示(即保留图像的交集部分)。
  • Bitmap:在 Android 中,图片以 Bitmap 对象的形式存储和处理。通过 Bitmap 对象可以对图片进行裁剪、缩放等处理。
实现步骤
  1. 加载原始图片

    • 使用 BitmapFactory.decodeResource() 从资源中加载图片。这里我们使用了一张图片资源 userphoto
     
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.userphoto);
    

  2. 创建 CanvasPaint 对象

    • Canvas 用于在新的 Bitmap 上绘制图形。我们创建一个新的 Bitmap,大小为图片的最小边长,以确保圆形能够完整地显示。
    • Paint 用于设置绘图样式,setAntiAlias(true) 开启抗锯齿,setFilterBitmap(true) 启用图像过滤,使图像更加平滑。
     
    Canvas canvas = new Canvas(output);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setFilterBitmap(true);
    paint.setDither(true);
    paint.setColor(Color.BLACK);
    

  3. 绘制圆形

    • 我们绘制一个圆形,圆心位置为 (width / 2, width / 2),半径为 width / 2,确保圆形正好填满整个 Bitmap
     
    canvas.drawCircle(width / 2f, width / 2f, width / 2f, paint);
    

  4. 设置 Xfermode(图像合成模式)

    • 设置 PorterDuffXfermodeSRC_IN,意味着我们只保留源图像(原始图片)和目标图像(当前圆形区域)交集的部分,其他部分会被透明填充。
    • SRC_IN 模式非常适合用于图片裁剪,因为它只显示重叠的部分。
     
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    

  5. 绘制原始图片到圆形区域

    • 使用 canvas.drawBitmap() 方法将原始图片绘制到指定区域。在这里我们计算了一个矩形区域 Rect,将图片绘制到这个区域内。
     
    canvas.drawBitmap(bitmap, null, rect, paint);
    

  6. 返回处理后的圆形图片

    • 完成绘制后,返回最终的圆形图片 output,可以在 UI 上展示。
     
    return output;
    

代码实现
 
public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityYuanBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// 返回按钮点击事件binding.fanhuiYuan.setOnClickListener(v -> {Intent intent = new Intent(YuanActivity.this, MainActivity.class);startActivity(intent);});// 加载原始图片Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.userphoto);// 获取圆形裁剪后的图片Bitmap circularBitmap = getCircularBitmap(bitmap);// 显示圆形图片binding.yuanxinphotoYuan.setImageBitmap(circularBitmap);}// 将图片裁剪为圆形private Bitmap getCircularBitmap(Bitmap bitmap) {// 获取原始图片的最小边长int width = Math.min(bitmap.getWidth(), bitmap.getHeight());// 创建一个新的 Bitmap,用于保存圆形效果的图像Bitmap output = Bitmap.createBitmap(width, width, 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); // 设置绘制圆形的颜色为黑色// 绘制圆形canvas.drawCircle(width / 2f, width / 2f, width / 2f, paint);// 设置 Xfermode 只保留源图像与圆形区域交集部分paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));// 计算图片放置区域Rect rect = new Rect(0, 0, width, width);// 绘制原始图片,只有圆形区域内的部分会显示canvas.drawBitmap(bitmap, null, rect, paint);return output; // 返回圆形图片}
}

关键概念详细解释
  1. Bitmap

    • Bitmap 是 Android 中表示图片的对象。它可以通过文件、资源或其他方式生成。在本示例中,我们从资源中加载了一张图片 R.drawable.userphoto,并将其转换为 Bitmap
  2. CanvasPaint

    • Canvas 是一个画布,用于绘制图形。所有的绘制操作(如绘制圆形、矩形、图片等)都是通过 Canvas 完成的。
    • Paint 用于设置绘图时的样式,比如颜色、抗锯齿、过滤器等。
  3. PorterDuff.Mode.SRC_IN

    • PorterDuff 是图像合成的模式。SRC_IN 模式意味着只保留源图像(原图)与目标图像(圆形区域)交集的部分,其余部分会变成透明。这个模式非常适合做图片裁剪,特别是圆形裁剪。
  4. drawCircle

    • Canvas.drawCircle() 用于绘制一个圆形。在裁剪圆形图片时,我们在 Canvas 上绘制一个圆形,作为裁剪的边界。
  5. Xfermode

    • Xfermode 用于定义图形绘制时如何合成。通过设置 SRC_IN 模式,我们确保只有圆形区域内的图片内容被显示,其他区域会被透明填充,从而实现圆形裁剪效果。

总结

通过结合 CanvasPaintPorterDuffXfermode,我们可以灵活地对图片进行裁剪,并实现如圆形、圆角矩形等效果。此方法非常适用于在 Android 中处理图像,并能够快速实现视觉效果。

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

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

相关文章

敖汉宝塔油页岩露天矿山安全自动化监测

1. 项目简介 本次项目位于内蒙古自治区赤峰市敖汉旗宝国吐乡大青山村,地理位置好。主营许可经营项目:无一般经营项目:页岩油生产;页岩油、润滑油、建筑材料(不含油漆)销售等单位规模1-20人,单位…

fedora下Jetbrains系列IDE窗口中文乱码解决方法

可以看到窗口右部分的中文内容为小方块。 进入 Settings - Appearance & Behavior - Appearance - Use custom font : Note Sans Mono CJK SC ,设置后如下图:

LeetCode题练习与总结:删除二叉搜索树中的节点--450

一、题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤&am…

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作,无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…

我国基本比例尺地形图介绍

目录 1.前言2.大中小比例尺划分3.使用的投影4.使用3度带6度带?5.详细介绍1:100万地形图1:50万地形图1:25万地形图1:10万地形图1:5万地形图1:2.5万地形图1:1万地形图1:5000地形图 6.总结 1.前言 本文搜集整理了我国国家基本比例尺地形图的情况,共11种&…

离线安装ollama到服务器

搜了很多教程不满意,弄了半天才弄好,这里记录下,方便以后的人用,那个在线下载太慢,怕不是得下载到明年。 一.从官网下在liunx版的tgz安装包 Releases ollama/ollama (github.com) 查看自己的服务器信息(参考 https:/…

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR,可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像(第一行)和二维码图像(第二行)。生成的二维码不仅忠实地保留…

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午,由 deepin(深度)社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG(武汉Linux用户组)线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法: 从多个角度来排查问题 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评…

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…

如何利用Java爬虫获得商品类目

在当今数字化时代,数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场…

筑起厂区安全--叉车安全防护装置全解析

在繁忙的工业生产领域中,叉车作为搬运工,穿梭于仓储与生产线之间。然而,叉车的高效运作背后,也隐藏着诸多安全风险,尤其是在那些空间狭小、物流繁忙的环境中。为了降低这些潜在的危险,叉车安全防护装置便成…

AI新动向:豆包文生图升级,文心一言领先市场

在今日的AI资讯中,我们关注到了几个重要的行业动态,其中包括字节跳动AI助手豆包的功能升级,以及百度文心一言在生成式AI市场的领先地位。 字节跳动旗下的智能AI助手豆包近期对其文生图能力进行了显著提升,用户现在可以通过一键操…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件,通过连接SIM卡与手机主板的方式,允许设备访问移动网络,用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良,造成信号中断&…

PDF文件打开之后不能打印,怎么解决?

正常的PDF文件是可以打印的,如果PDF文件打开之后发现文件不能打印,我们需要先查看一下自己的打印机是否能够正常运行,如果打印机是正常的,我们再查看一下,文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

JUC:读写锁和邮戳锁

1. 面试题 你知道Java里面有那些锁你说说你用过的锁,锁饥饿问题是什么?有没有比读写锁更快的锁StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制,你知道吗? 2. 读写锁&a…

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

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

MongoDB的简单使用

MongoDB(文档数据库)的简单使用 MongoDB最好的学习资料就是他的官方文档:SQL 到 MongoDB 的映射图表 - MongoDB 手册 v8.0 1.MongoDB CRUD操作 1.1Insert操作 基本方法: db.collection.insertOne() 将单个文档(document)插入集合中 db.collectio…

chromedriver.exe编译

使用例子参考官网 ChromeDriver 使用入门 | Chrome for Developers Chrome for Testing availability 注意:chromedriver版本要与chromium版本号对应。 如何编译chromedriver chrome\test\chromedriver\BUILD.gn 1、ninja -C out/debug chromedriver_server…

基于MinIO打造高可靠分布式“本地”文件系统

MinIO是一款高性能的对象存储服务,而S3协议是由亚马逊Web服务(AWS)制定的一种标准协议,用于云存储服务之间的数据交换。MinIO与S3协议的关系在于,MinIO实现了S3协议的接口,这意味着用户可以使用与AWS S3相同…