PorterDuffXfermode与圆角图片
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
圆角图片
在项目开发中,我们常用到这样的功能:显示圆角图片。
这个是咋做的呢?我们来瞅瞅其中一种实现方式
/*** @param bitmap 原图* @param pixels 角度* @return 带圆角的图*/public Bitmap getRoundCornerBitmap(Bitmap bitmap, float pixels) {int width=bitmap.getWidth();int height=bitmap.getHeight();Bitmap roundCornerBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(roundCornerBitmap);Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setAntiAlias(true);Rect rect = new Rect(0, 0, width, height);RectF rectF = new RectF(rect);canvas.drawRoundRect(rectF, pixels, pixels, paint);PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);paint.setXfermode(xfermode);canvas.drawBitmap(bitmap, rect, rect, paint);return roundCornerBitmap;}
主要操作如下:
- 1、生成canvas,请参见代码第7-10行。注意给canvas设置的Bitmap的大小是和原图的大小一致的
- 2、绘制圆角矩形,请参见代码第11-16行
- 3、为Paint设置PorterDuffXfermode,请参见代码第17-18行
- 4、绘制原图,请参见代码第19行
PorterDuffXfermode
纵观代码,发现一个陌生的东西PorterDuffXfermode而且陌生到了我们看到它的名字却不容易猜测其用途的地步;这在Android的源码中还是很少有的。
我以前郁闷了很久,不知道它为什么叫这个名字,直到后来看到《Android多媒体开发高级编程》才略知其原委。
Thomas Porter和Tom Duff于1984年在ACM SIGGRAPH计算机图形学刊物上发表了《Compositing digital images》。在这篇文章中详细介绍了一系列不同的规则用于彼此重叠地绘制图像;这些规则中定义了哪些图像的哪些部分将出现在输出结果中。
这就是PorterDuffXfermode的名字由来及其核心作用。
现将PorterDuffXfermode描述的规则做一个介绍:
- PorterDuff.Mode.CLEAR
绘制不会提交到画布上 - PorterDuff.Mode.SRC
只显示绘制源图像 - PorterDuff.Mode.DST
只显示目标图像,即已在画布上的初始图像 - PorterDuff.Mode.SRC_OVER
正常绘制显示,即后绘制的叠加在原来绘制的图上 - PorterDuff.Mode.DST_OVER
上下两层都显示但是下层(DST)居上显示 - PorterDuff.Mode.SRC_IN
取两层绘制的交集且只显示上层(SRC) - PorterDuff.Mode.DST_IN
取两层绘制的交集且只显示下层(DST) - PorterDuff.Mode.SRC_OUT
取两层绘制的不相交的部分且只显示上层(SRC) - PorterDuff.Mode.DST_OUT
取两层绘制的不相交的部分且只显示下层(DST) - PorterDuff.Mode.SRC_ATOP
两层相交,取下层(DST)的非相交部分和上层(SRC)的相交部分 - PorterDuff.Mode.DST_ATOP
两层相交,取上层(SRC)的非相交部分和下层(DST)的相交部分 - PorterDuff.Mode.XOR
挖去两图层相交的部分 - PorterDuff.Mode.DARKEN
显示两图层全部区域且加深交集部分的颜色 - PorterDuff.Mode.LIGHTEN
显示两图层全部区域且点亮交集部分的颜色 - PorterDuff.Mode.MULTIPLY
显示两图层相交部分且加深该部分的颜色 - PorterDuff.Mode.SCREEN
显示两图层全部区域且将该部分颜色变为透明色
了解了这些规则,再回头看我们刚才例子中的代码,就好理解多了。
我们先画了一个圆角矩形,然后设置了PorterDuff.Mode为SRC_IN,最后绘制了原图。 所以,它会取圆角矩形和原图相交的部分但只显示原图部分;这样就形成了圆角的Bitmap。
相关文章:
PorterDuffXfermode与圆角图片
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 圆角图片 在项目开发中,我们常用到这样的功能:显示圆角图片。 这个是咋做的呢?我们来瞅瞅其中一种实现方式 /*** param bitmap 原图* p…...
如何准备大学生电子设计竞赛
大学生电子设计竞赛难度中上,一般有好几个类型题目可以选择,参赛者可以根据自己团队的能力、优势去选择合适自己的题目,灵活自主空间较大。参赛的同学们可以在暑假好好学习相关内容,把往年的题目拿来练练手。这个比赛含金量还是有…...
【Java容器(jdk17)】ArrayList深入源码,就是这么简单
ArrayList深入源码一、ArrayList源码解析1. MIXIN 的混入2. 属性说明3. 构造方法4. 其他方法(核心)iterator 和 listIterator 方法add方法remove 方法sort方法其他二、ArrayList 为什么是线程不安全的?体现哪些方面呢?三、ArrayLi…...
【Java 面试合集】简述下Java的三个特性 以及项目中的应用
简述下Java的特征 以及项目中的应用 1. 概述 上述截图中就是Java的三大特性,以及特性的实现方案。接下来就每个点展开来说说 2. 封装 满足:隐藏实现细节,公开使用方法 的都可以理解为是封装 而实现封装的有利手段就是权限修饰符了。可以根据…...
git基本概念图示【学习】
基本概念工作区(Working Directory)就是你在电脑里能看到的目录,比如名字为 gafish.github.com 的文件夹就是一个工作区本地版本库(Local Repository)工作区有一个隐藏目录 .git,这个不算工作区,…...
微前端qiankun架构 (基于vue2实现)使用教程
工具使用版本 node --> 16vue/cli --> 5 创建文件 创建文件夹qiankun-test。 使用vue脚手架创建主应用main和子应用dev 主应用 安装 qiankun: yarn add qiankun 或者 npm i qiankun -S 使用qiankun: 在 utils 内创建 微应用文件夹 microApp,在该文件夹…...
记录robosense RS-LIDAR-16使用过程3
一、wireshark抓包保存pcap文件并解析ubuntu18安装wireshark,参考下面csdn教程,官网教程我看的一脸蒙(可能英语太差)https://blog.csdn.net/weixin_46048542/article/details/121730448?spm1001.2101.3001.6650.2&utm_medium…...
【博学谷学习记录】大数据课程-学习第七周总结
Hadoop配置文件修改 Hadoop安装主要就是配置文件的修改,一般在主节点进行修改,完毕后scp下发给其他各个从节点机器 文件中设置的是Hadoop运行时需要的环境变量。JAVA_HOME是必须设置的,即使我们当前的系统中设置了JAVA_HOME,它也…...
154、【动态规划】leetcode ——494. 目标和:回溯法+动态规划(C++版本)
题目描述 原题链接:494. 目标和 解题思路 (1)回溯法 本题的特点是nums中每个元素只能使用一次,分别试探加上nums[index]和减去nums[index],然后递归的遍历下一个元素index 1。 class Solution { public:int res …...
MySQL-窗口函数
窗口函数概念常用窗口函数聚合窗口函数专用窗口函数语法OVER子句window_specwindow_name (命名窗口)partition_clause 分区order_clause 排序frame_clause 范围 (指定窗口大小)使用限制练习准备概念 窗口函数对一组查询执行类似于聚合的操作。然而&#…...
【C++设计模式】学习笔记(1):面向对象设计原则
目录 简介面向对象设计原则(1)依赖倒置原则(DIP)(2)开放封闭原则(OCP)(3)单一职责原则(SRP)(4)Liskov替换原则(LSP)(5)接口隔离原则(ISP)(6)优先使用对象组合,而不是类继承(7)封装变化点(8)针对接口编程,而不是针对实现编程结语简介 Hello! 非常感谢您阅读海…...
[测开篇]设计测试用例的方法如何正确描述Bug
文章目录为什么测试人员要写测试用例?怎样设计测试用例?(总的方面)1.基于需求设计测试用例(总的方面) 2.页面(总的方面) 3.非功能性测试(具体方面) 4.1 等…...
设计模式学习笔记--单例、建造者、适配器、装饰、外观、组合
以下内容根据以下网址及相关视频整理:Android设计模式之单例模式_谬谬清不给我取名字的博客-CSDN博客_android 单例模式 Android设计模式--单例模式的六种实现和单例模式讲解Volatile与Synchronized相关的并发_龙腾腾的博客-CSDN博客_android 单例 volatile java …...
English Learning - Day5 L1考前复习 2023.2.10 周五
English Learning - Day5 L1考前复习 2023.2.10 周五1 单选题:She has the face _________.2 单选题: The goals ________ he fought all his life no longer seemed important to him.3 单选题:Sales director is a position ______ communi…...
C. Prepend and Append
time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Timur initially had a binary string†† s� (possibly of length 00). He performed the following operation several (possibly zero)…...
javassm超市在线配送管理系统
为了解决用户便捷地在网上购物,本文设计和开发了一个超市管理系统。本系统是基于web架构设计,SSM框架 ,使用Mysql数据库管理,综合采用JSP模式来完成系统的相关功能。主要实现了管理员与用户的注册与登陆,个人中心、用户…...
Scratch少儿编程案例-多模式贪吃蛇(无尽和计时)
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
谷歌蜘蛛池怎么搭建?Google蜘蛛池可以帮助谷歌排名吗?
本文主要分享关于谷歌蜘蛛池的搭建疑问,以及Google对谷歌排名的影响到底有多大。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 谷歌蜘蛛池怎么搭建? 答案是:需要一个内链外链体系复杂的站群系统…...
Kubernetes集群-部署Java项目
Kubernetes集群-部署Java项目(SSG) k8s部署项目java流程图 第一步 打包制作镜像 打包 java源码: application.properties #在有pom.xml的路径下执行 mvn clean package制作镜像: 将刚才打包后的文件夹传到,装有dock…...
English Learning - Day54 作业打卡 2023.2.8 周三
English Learning - Day54 作业打卡 2023.2.8 周三引言1. 就算你不喜欢喝酒,也请尝一杯吧。2. 便纵有千种风情,更与何人说?——柳永《雨霖铃》 (来,挑战一下古诗词)3. 虽然忙,我也要参加会议。4. 无论发生什么…...
基于FreeRTOS与LVGL的智能手表开源系统InfiniTime开发指南
1. 项目概述:为你的智能手表注入灵魂 如果你手上有一块PineTime或者类似的低功耗智能手表,并且对官方固件那有限的功能感到意犹未尽,那么“InfiniTime”这个名字你应该不会陌生。它不是一个简单的应用商店,而是一个为这类开源硬件…...
Java 程序员第 2 阶段:精通 SpringBoot 整合大模型,快速搭建基础服务
前言上一阶段我们掌握了原生 API 调用,但在大规模生产环境中,使用专业的 Java 框架能大幅提升开发效率。SpringAI 和 LangChain4j 是 Java 生态中最主流的大模型集成框架。本篇文章将手把手带你精通 SpringBoot 整合大模型,快速搭建企业级 AI…...
Linux系统级音频处理:JDSP4Linux架构、DSP效果器与实战调音指南
1. 项目概述:从“听个响”到“听个准”的桌面音频革命如果你是一个对电脑音质有追求的Linux用户,或者是一个音频领域的开发者,那么你很可能经历过这样的困扰:系统自带的音频管理就像个“大锅饭”,所有声音都混在一起&a…...
Gentoo Linux 中通过 Overlay 优雅安装 Cursor 二进制编辑器
1. 项目概述与背景如果你是一名 Gentoo Linux 的用户,同时又对 Cursor 这款新兴的 AI 代码编辑器感兴趣,那么你很可能已经遇到了一个经典的 Gentoo 式难题:如何在这样一个以源码编译为核心的发行版上,方便地安装一个官方只提供.de…...
[STM32U3] 【每周分享】【STM32U385RG 测评】+串口发送、接收数据
上篇串口通讯只是打印叔数据,这篇更进一步,将串口发送什么,就打印什么出来 一、查看原理图,确定自己需要的串口信息 还是一样的串口1 二、开始配置软件 上面基础配置结束之后,增加DMA以及NVIC配置 时钟可以根据自…...
基于MCP协议与向量检索,为AI编程助手构建跨会话持久记忆
1. 项目概述:为AI编程助手构建持久记忆如果你和我一样,日常重度依赖Cursor、Claude Code、Windsurf这类AI编程助手,那你一定遇到过这个让人头疼的场景:昨天在Cursor里花了半小时跟AI解释清楚了一个复杂模块的业务逻辑和设计思路&a…...
ARM CoreSight TRBPIDR寄存器详解与调试技巧
1. ARM CoreSight TRBPIDR寄存器概述在嵌入式系统调试领域,ARM CoreSight架构提供了一套完整的调试和追踪解决方案。其中TRBPIDR(Trace Buffer Peripheral Identification Register)系列寄存器是识别和配置追踪缓冲区的关键组件。这些寄存器遵…...
ISSCC传感器设计启示:从高精度温度测量到低功耗系统优化
1. 从ISSCC看传感器设计的巅峰与启示每年二月的国际固态电路会议,对于像我这样泡在实验室和产线里的硬件工程师来说,就像一场技术界的“春晚”。它不发布概念,不空谈趋势,只展示过去一年里,全球顶尖研究团队在硅片上实…...
RISC-V架构下轻量级LLM推理引擎的优化与部署实践
1. 项目概述:一个为RISC-V架构优化的轻量级LLM推理引擎最近在折腾边缘计算和嵌入式AI部署的朋友,可能都绕不开一个核心矛盾:大语言模型(LLM)能力虽强,但动辄数十亿甚至上百亿的参数规模,对计算资…...
鸣潮帧率解锁终极指南:用WaveTools轻松突破120FPS限制
鸣潮帧率解锁终极指南:用WaveTools轻松突破120FPS限制 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为鸣潮游戏中被锁定的60FPS帧率而烦恼吗?想让你的高刷新率显示器发挥真正…...
