先上图,有图有实践

很明显前一个指纹把下面的签名遮挡住,后一个达到了签名按指纹的效果

注:在Android7.0上面测试效果不佳

目录

前言

一、Bitmap是什么?

二、使用setPixel 修改指纹背景颜色

三、使用setPixel 修改指纹纹路颜色

总结


前言

项目新需求在后端根据用于填写的信息要生成文档,再填写完信息后会在终端上进行签名和收集指纹,并且指纹还需要覆盖到前的名字上面,达到签字按手印的效果。

一想SO easy!,不就是两个图片重叠起来不就可以了么。

但是指纹提取的图片是存白色的背景,需要改成透明的。指纹纹路还是黑色的,需要改成红色的,一时难住了,于是乎各种百度各种搜。

一、Bitmap是什么?

位图Bitmap),又称栅格图(英语:Raster graphics)或点阵图,是使用像素阵列(Pixel-array/Dot-matrix点阵)来表示的图像。

其主要使用到了setPixel(int x,int y,int color)方法,这个方法是用来操作像素点的。其中这三个的参数含义x–要替换的像素的x坐标; y–要替换 的像素的y坐标;color–要写入位图的ARGB颜色

二、使用setPixel 修改指纹背景颜色

建议:适用于纯色背景颜色

代码示例如下:

 /*** TODO 建议:适用于纯色背景颜色* 改变背景颜色* @param oldBitmap 原bm* @param config 配置的参数 如果修改后的背景还是有点瑕疵  可以尝试更改config值:ALPHA_8, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE* @param oldColor 需要替换的背景色*/fun replaceBitmapColor(oldBitmap: Bitmap,config: Bitmap.Config = Bitmap.Config.ARGB_4444,oldColor: Int = Color.WHITE,newColor: Int = Color.TRANSPARENT): Bitmap? {if (null == oldBitmap) return nullval mBitmap = oldBitmap.copy(config, true)
//循环获得bitmap所有像素点val mBitmapWidth = mBitmap.widthval mBitmapHeight = mBitmap.heightfor (i in 0 until mBitmapHeight) {for (j in 0 until mBitmapWidth) {
//获得Bitmap 图片中每一个点的color颜色值
//将需要填充的颜色值如果不是
//在这说明一下 如果color 是全透明 或者全黑 返回值为 0
//getPixel()不带透明通道 getPixel32()才带透明部分 以全透明是0x00000000
//而不透明黑色是0xFF000000 如果不计算透明部分就都是0了val color = mBitmap.getPixel(j, i)if (color == oldColor) {mBitmap.setPixel(j, i, newColor) //将白色替换成透明色}}}oldBitmap.recycle()return mBitmap}

三、使用setPixel 修改指纹纹路颜色

/*** 修改颜色*/fun dealBackground(bm: Bitmap): Bitmap {for (i in 0 until bm.width) {for (j in 0 until bm.height) {val color = bm.getPixel(i, j)
//                获取像素点的RGB颜色值val R: Int = Color.red(color) ?: 0val G: Int = Color.green(color) ?: 0val B: Int = Color.blue(color) ?: 0"图片处理----$R--$G---$B".loge()
//                将接近白色的背景替换成为白色的背景,用于之后处理透明
//                将不是白色的背景替换为红色也就是指纹的纹路if (R > 240 && G > 240 && B > 240) {val newColor: Int = Color.argb(0, 255, 255, 255)bm.setPixel(i, j, newColor)} else {val newColor: Int = Color.argb(0, 255, 0, 0)bm.setPixel(i, j, newColor)}}}return bm}

完整代码


import android.graphics.Bitmap
import android.graphics.Color
import me.hgj.jetpackmvvm.ext.util.loge/*** 改变颜色值、改变背景透明度*/
object BitmapUtils {/*** TODO 建议:适用于纯色背景颜色* 改变背景颜色* @param oldBitmap 原bm* @param config 配置的参数 如果修改后的背景还是有点瑕疵  可以尝试更改config值:ALPHA_8, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE* @param oldColor 需要替换的背景色*/fun replaceBitmapColor(oldBitmap: Bitmap,config: Bitmap.Config = Bitmap.Config.ARGB_4444,oldColor: Int = Color.WHITE,newColor: Int = Color.TRANSPARENT): Bitmap? {if (null == oldBitmap) return nullval mBitmap = oldBitmap.copy(config, true)
//循环获得bitmap所有像素点val mBitmapWidth = mBitmap.widthval mBitmapHeight = mBitmap.heightfor (i in 0 until mBitmapHeight) {for (j in 0 until mBitmapWidth) {
//获得Bitmap 图片中每一个点的color颜色值
//将需要填充的颜色值如果不是
//在这说明一下 如果color 是全透明 或者全黑 返回值为 0
//getPixel()不带透明通道 getPixel32()才带透明部分 以全透明是0x00000000
//而不透明黑色是0xFF000000 如果不计算透明部分就都是0了val color = mBitmap.getPixel(j, i)if (color == oldColor) {mBitmap.setPixel(j, i, newColor) //将白色替换成透明色}}}oldBitmap.recycle()return mBitmap}/*** 修改颜色*/fun dealBackground(bm: Bitmap): Bitmap {for (i in 0 until bm.width) {for (j in 0 until bm.height) {val color = bm.getPixel(i, j)
//                获取像素点的RGB颜色值val R: Int = Color.red(color) ?: 0val G: Int = Color.green(color) ?: 0val B: Int = Color.blue(color) ?: 0"图片处理----$R--$G---$B".loge()
//                将接近白色的背景替换成为白色的背景,用于之后处理透明
//                将不是白色的背景替换为红色也就是指纹的纹路if (R > 240 && G > 240 && B > 240) {val newColor: Int = Color.argb(0, 255, 255, 255)bm.setPixel(i, j, newColor)} else {val newColor: Int = Color.argb(0, 255, 0, 0)bm.setPixel(i, j, newColor)}}}return bm}
}

总结

Bitmap未发现的方法还有很多,具体主要使用到了setPixel方法。

Bitmap 处理图片修改为透明背景,改变主颜色相关推荐

  1. 安卓动态修改系统状态栏背景和文字颜色,以及动态显示或隐藏系统状态栏

    关于动态修改系统状态栏背景.字体和图标颜色,以及动态显示或隐藏系统状态栏,一直都是都是许多项目的常规需求.但是,由于不同版本间的兼容性差异,网上的实现方法多种多样.并且,许多方法都会存在这样.那样的不 ...

  2. 修改Arduino IDE背景和字体颜色

    目录 修改背景颜色 修改字体颜色 修改单行注释的颜色 修改多行注释的颜色 修改控制台颜色 十六进制颜色码 修改背景颜色 打开arduino的安装文件夹>lib>theme>theme ...

  3. PIL修改带有透明像素的png图片颜色

    知识补充 颜色有两种 RGBA 和 RGB, 前者有 4 个值(r, g, b, a),后者有 3 个值(r,g,b),每个都是 0 到 255,RGBA 的 a 就代表透明度.a= 0表示透明 ge ...

  4. Photoshop png图片改变 透明背景之外的图片颜色

    png图片改变 透明背景之外的图片颜色 1.打开需要修改的图片 2.新建新的图层 3.右键创建剪切蒙版 4.打开主菜单前景色 4.设置自己想要的颜色 5.按Alt+Delete将颜色填充满蒙版 大功告 ...

  5. mysql修改主键属性_mysql如何改变主键属性

    mysql改变主键属性的方法:1.使用关键字modify,代码为[alter table tbl_name modify.....]:2.使用关键字change,代码为[alter table tbl ...

  6. 人工智能 - 虚拟人 - 虚拟主播(透明背景)

    网站首页 透明背景设置 步骤1 - 首先将虚拟角色背景设置成绿色 步骤2 - 打开OBS窗口,点击滤镜按钮 步骤3 - 点击+号,选择色度键 步骤4 - 点击确定 步骤5 - 关键颜色类型选择:绿色 ...

  7. gif透明背景动画_BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点

    一张图片可以储存为多种格式,为什么有的几十KB,有的几百MB,有的静止不动,有的是好几个画面循环播放?在项目开发的过程中经常会读取或保存图像文件,不同类型的图像特点不同,适用的范围也不同,简要介绍BM ...

  8. PNG透明背景显示之路

    在VC7.1中 MFC图形处理类里有一个强大的成员---CImage,这个类提供了从外部磁盘中调入一个JPEG.GIF.BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换.由于CIma ...

  9. 在Win32API窗体下实现透明背景

    前面拜读过本站无数高手的许多好文章,受益非浅,首先向各位大侠致敬!今天编程偶有小得,不敢独享,特拿出来与各位共享,希望对某些朋友有些许帮助. 透明窗体的问题相信大家已经很熟悉了,前面的几期在线杂志也有 ...

最新文章

  1. Linux磁盘管理:LVM逻辑卷的拉伸及缩减
  2. 关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的问题
  3. 【小白学习PyTorch教程】三、Pytorch中的NN模块并实现第一个神经网络模型
  4. python笔记之scrapy
  5. 2.3 基本算法之递归变递推 1188 菲波那契数列(2) python
  6. 配置连接池连接oracle,Oracle连接池怎么配置
  7. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
  8. 【51单片机】往返流水灯代码
  9. SQL5.5安装教程
  10. 如何本地修改dns服务器,如何更新本地DNS?
  11. 不是私密链接,如何继续前往?
  12. R(13):第三章:3.2数据的分布
  13. 项管行知04--项目章程
  14. python散点图坐标刻度_python – 散点图中的轴范围
  15. linux内核usleep,Linux下的usleep函数
  16. 医美面膜商城小程序开发,助力企业数字化转型
  17. apicloud菜鸟教程_干货教程 | APICloud新手学习心得分享
  18. ICASSP2022论文阅读记录3 - TalkingFlow
  19. Fortran中function,subroutine, interface和module的简单使用
  20. 来了来了,卡券系统。

热门文章

  1. 辽师计算机杂志期刊等级认定,辽师学术期刊认标准(2017年5月修订).doc
  2. 微型计算机普遍使用的编码是什么,微型计算机中普遍使用的字符编码是什么吗...
  3. HashMap夺命连环问,你扛得住吗
  4. 关于应用版本号的更迭
  5. 计算机毕业设计每章小结怎么写?
  6. 小狼毫输入法皮肤配置【自带皮肤配置】
  7. 编写CSDN博客,如何去掉插入的图片上的水印
  8. 【华人学者风采】宋晓东 加州大学伯克利分校
  9. 2015年度汽车客运站现状分析及未来趋势发展报告
  10. TWS耳机行业现状:苹果想通吃,微软欲入局