当前位置: 首页 > news >正文

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描述的规则做一个介绍:
这里写图片描述

  1. PorterDuff.Mode.CLEAR
    绘制不会提交到画布上
  2. PorterDuff.Mode.SRC
    只显示绘制源图像
  3. PorterDuff.Mode.DST
    只显示目标图像,即已在画布上的初始图像
  4. PorterDuff.Mode.SRC_OVER
    正常绘制显示,即后绘制的叠加在原来绘制的图上
  5. PorterDuff.Mode.DST_OVER
    上下两层都显示但是下层(DST)居上显示
  6. PorterDuff.Mode.SRC_IN
    取两层绘制的交集且只显示上层(SRC)
  7. PorterDuff.Mode.DST_IN
    取两层绘制的交集且只显示下层(DST)
  8. PorterDuff.Mode.SRC_OUT
    取两层绘制的不相交的部分且只显示上层(SRC)
  9. PorterDuff.Mode.DST_OUT
    取两层绘制的不相交的部分且只显示下层(DST)
  10. PorterDuff.Mode.SRC_ATOP
    两层相交,取下层(DST)的非相交部分和上层(SRC)的相交部分
  11. PorterDuff.Mode.DST_ATOP
    两层相交,取上层(SRC)的非相交部分和下层(DST)的相交部分
  12. PorterDuff.Mode.XOR
    挖去两图层相交的部分
  13. PorterDuff.Mode.DARKEN
    显示两图层全部区域且加深交集部分的颜色
  14. PorterDuff.Mode.LIGHTEN
    显示两图层全部区域且点亮交集部分的颜色
  15. PorterDuff.Mode.MULTIPLY
    显示两图层相交部分且加深该部分的颜色
  16. 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,这个不算工作区&#xff0c…...

微前端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. 无论发生什么&#xf…...

【Unity题】 1.矩阵旋转,欧拉旋转,四元数旋转各自的优缺点。2.StringBuilder和String的区别

1.矩阵旋转,欧拉旋转,四元数旋转各自的优缺点 矩阵旋转,欧拉旋转,四元数旋转是三种不同的旋转表示方法,下面是它们各自的优缺点: 矩阵旋转: 优点: 1.可以方便地实现复合旋转&…...

【C++面试问答】搞清楚深拷贝与浅拷贝的区别

问题 深拷贝和浅拷贝的区别是面试中的常见问题之一,对于不同的编程语言,这个问题的回答可能稍有差别,下面我们就来探索一下它们之间的异同吧。 先来看看在JavaScript对象的深拷贝与浅拷贝的区别: 浅拷贝:只是复制了…...

day10_面向对象基础

今日内容 零、 复习昨日 一、面向对象的概念 二、面向对象编程 三、内存图 零、 复习昨日 见晨考题 每日一数组题 写一个方法 用于合并两个int类型的数组 合并法则如下 {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0} package com.qf.array;import java.util.Arrays;/*** --- 天…...

电影订票网站的设计与开发

技术:Java、JSP等摘要:随着科技的发展,时代的进步,互联网已经成为了人们生活中不可缺少的一部分,网上购物已然是一种时代的象征。纵观市场,电影行业的发展尤为迅速,电影种类和数量的增多导致客流…...

seata【SAGA模式】代码实践(细节未必完全符合saga的配置,仅参考)

seata SAGA模式: 代码仍然是上一篇AT模式的代码:AT模式 不需要undo_log表 下面开始: 首先,saga模式依靠状态机的json文件来执行整个流程,其中的开始节点的服务即TM,然后状态机需要依靠三张表&#xff0…...

面试题:Java锁机制

java对象包含了三个部分:对象头,实例数据和对齐填充。对象头又存放了:markWord和class point。classpoint :指向方法区,当前对象的类信息数据。markword:存储了很多和当前对象运行时的数据:例如…...

Springboot Web开发

文章目录一. 静态资源访问1. 配置静态资源访问前缀2. 修改默认静态资源存放目录3. Webjars4. 欢迎页支持5. 自定义Favicon二. 请求处理1. 路径变量2. 请求头处理3. 查询字符串处理4. 获取Cookie的值5. 获取请求体的值6. 获取请求域中的数据7. 矩阵变量一. 静态资源访问 只要静…...

分布式事务 | 使用DTM 的Saga 模式

DTM 简介前面章节提及的MassTransit、dotnetcore/CAP都提供了分布式事务的处理能力,但也仅局限于Saga和本地消息表模式的实现。那有没有一个独立的分布式事务解决方案,涵盖多种分布式事务处理模式,如Saga、TCC、XA模式等。有,目前…...

错误代码0xc0000001要怎么解决?如何修复错误

出现错误代码0xc0000001这个要怎么解决?其实这个的蓝屏问题还是非常的简单的,有多种方法可以实现 解决方法一 1、首先使用电脑系统自带的修复功能,首先长按开机键强制电脑关机。 注:如果有重要的资料请先提前备份好,…...

为什么 HTTP PATCH 方法不是幂等的及其延伸

幂等性 首先来看什么是幂等性,根据 rfc2616(Hypertext Transfer Protocol – HTTP/1.1) 文档第 50 页底部对 Idempotent Methods 的定义: Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the…...

网站建设 小程序开发 营销推广/百度有哪些app产品

上篇文章中,我们讲了在 Spring Security 中如何踢掉前一个登录用户,或者禁止用户二次登录,通过一个简单的案例,实现了我们想要的效果。但是有一个不太完美的地方,就是我们的用户是配置在内存中的用户,我们没…...

自己做的网站外网访问/市场营销推广策划方案

一:语句块 语句块是指成块的代码,通常由若干行组成(也有的只有单条语句的语句块),和块外的代码处于不同的层次关系。 Python使用行首的缩进来标明语句块。Python 解释器没有限制在每一级缩进使用几个空格&#xff0c…...

做餐饮系统网站/百度网盘pc端网页版

对于人,整数和浮点数的区别在于它们的书写。 对于计算机,区别在于它们的存储方式。 整数就是没有小数部分的数。 在C中小数点永远不会出现在整数的书写中。 整数是以二进制数字存储。 例如整数7的二进制表示为111 在8位的字节中存储它需要将前5位置…...

网站数据怎么备份/竞价外包推广专业公司

可以写一个函数: 主要是使用正则来判断。另外输入字符是空的话,使用"-"来替换。 CREATE FUNCTION [dbo].[svf_NonNegativeInteger] (val NVARCHAR(4000) ) RETURNS BIT AS BEGINDECLARErtv BIT 1SET val ISNULL(LTRIM(RTRIM(val)), N-)IF va…...

做php网站会员开店代码如何编写/网站数据分析

Island of Survival 题目链接 题目大意:现在你所在的岛上有 ttt 只老虎, ddd 只鹿。 每一天随机选出两只动物,将会发生下列五种情况: 1.你与老虎,那你没了。 2.老虎与鹿,鹿没了。 3.两只鹿,相…...

厦门外贸公司做网站/百度搜图

我很确定你不能通过limits.conf设置服务限制,但仅限于用户空间.Crontab在指定的用户空间中执行脚本,该用户空间通过用户名从/ etc / crontab定义,或者从用户自己的个人crontab定义.因此,必须在用户空间级别或自己的脚本内部应用限制.但是正确的是你需要在pam.d / cron下启用限制…...