背景
用户通过笔在纸上手写了个人签名,通过拍照上传的方式将其笔迹设置为签名图片。
如果直接使用此图片(包括裁剪后的图片),则在签名的过程中会签名图案中不但有用户的笔迹,还有纸的颜色背景,效果堪忧。
解决目标
将用户的手写笔迹采集,并且背景色是透明的
解决思路

  1. 用户选择已经拍摄的笔迹照片
  2. 用户通过裁剪区域选择手写笔迹(尺寸为300*120)
  3. 程序将裁剪好的手写笔迹区域进行笔迹采集和透明化处理
    -将图片中的黑色像素点1 保留,其他像素点设置为透明 (难点和重点:哪些色值可以被认定为笔迹、用户拍照时候的光线影响、用户手写纸的背景色)
    -将图片保存为手写区域
  4. 将处理好的手写笔迹采集结果给用户预览
  5. 用户确认后将此手写笔迹处理后的图提交给服务端

Android模块的核心代码(图片裁剪不在此范围)

package cn.org.bjca.wcert.ywq.utils;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Environment;import java.io.File;
import java.io.FileOutputStream;/************************************************************************************************** <pre>* @包路径: cn.org.bjca.wcert.ywq.utils* @版权所有: 北京数字认证股份有限公司 (C) 2020** @类描述: 手写笔迹处理* @版本: V4.0.0* @作者 daizhenhong* @创建时间 2020/11/2 3:50 PM
</pre>************************************************************************************************/
public class HandSignUtil {final static String filePathHeader = "file://";private final static int maxColorBlack = 145;private final static int mColorDifMax = 14;/*** 将已经裁剪了的手写签名笔迹图片进行透明化处理** @param context* @param imagePath 图片的文件地址(前缀是file://)* @return 经过背景透明化处理后的图片地址(需要添加file://协议头)* @throws Exception*/public static String getHandSignByImagePath(Context context, String imagePath) throws Exception {String path = imagePath.substring(filePathHeader.length());Bitmap originBitmap = BitmapFactory.decodeFile(path);Bitmap translateBitmap = translateBitmap(originBitmap);String filePath = getSaveImagePath(context);File saveFile = new File(filePath);translateBitmap.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(saveFile));return filePathHeader + saveFile.toString();}private static String getSaveImagePath(Context context) {String cachePath = "";if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())|| !Environment.isExternalStorageRemovable()) {cachePath = context.getExternalCacheDir().getPath();} else {cachePath = context.getCacheDir().getPath();}File fileParent = new File(cachePath);if (!fileParent.exists()) {fileParent.mkdirs();}File path = new File(cachePath, System.currentTimeMillis() + ".png");return path.toString();}/*** 将图片进行背景透明化处理** @param originBitmap 原始图片的bitmap对象* @return 背景透明化处理后的bitmap*/private static Bitmap translateBitmap(Bitmap originBitmap) {Bitmap translateBitmap = originBitmap.copy(Bitmap.Config.ARGB_8888, true);int nWidth = translateBitmap.getWidth();int nHeight = translateBitmap.getHeight();// 由于图片经过裁剪后是jpeg格式的,如果直接保存成png图片,会造成透明的背景色变成黑色(因为jpeg图片没有alpha通道)Bitmap resultBitmap = Bitmap.createBitmap(nWidth, nHeight, Bitmap.Config.ARGB_8888);for (int y = 0; y < nHeight; ++y)for (int x = 0; x < nWidth; ++x) {int nPixelColor = originBitmap.getPixel(x, y);int newColor = getNewColor(nPixelColor);resultBitmap.setPixel(x, y, newColor);}return resultBitmap;}/*** 获取像素点需要变更的颜色* 当像素点不是黑色的,则将其设置为透明** @param nPixelColor* @return*/private static int getNewColor(int nPixelColor) {if (isBlackColor(nPixelColor)) {return Color.argb(Color.alpha(nPixelColor), Color.red(nPixelColor), Color.green(nPixelColor), Color.blue(nPixelColor));}return Color.TRANSPARENT;}/*** 判断是否是黑色笔迹** @param color 颜色的int值* @return true-认定为黑色笔迹*/private static boolean isBlackColor(int color) {int r = Color.red(color);int g = Color.green(color);int b = Color.blue(color);int colorMax = Math.max(Math.max(r, g), b);int colorMin = Math.min(Math.min(r, g), b);int dif = colorMax - colorMin;return colorMax < maxColorBlack && dif <= mColorDifMax;}}

  1. 黑色像素点我们的计算方式:图像的像素有rgb(jpeg图片)或rgba组件(png图片),我们目前的设定是:rgb的最大一项不大于145 ,同时rgb之前的最大差距不能超过14 ↩︎

手写签名图片处理-Android相关推荐

  1. jsignature插件实操,完成手写签名图片格式功能

    jSignature是什么,如何使用? jSignature是一个H5基于canvas画布得一个插件可以用于手机,浏览器进行手写签名功能实现啦 Jsignature使用效果展示 注:本插件最新版是支持 ...

  2. 小程序-手写签名(附代码)

    方法不是我自己写的,但是也忘记最初的原版出自于哪里了,不过搜索下来就是大同小异,我就附上自己实测有效的!可以直接拿了用,只不过最后保存手写签名图片的方法自己写就可以了,用的就是小程序的图片上传方法. ...

  3. html移动端实现手写签名,signature手写签名实现,微信公众号浏览器html手写签名实现

    前言 html移动端手写自动横竖签名实现,并base64图片格式获取: 横竖根据屏幕宽高自动平铺. 效果图 图一 图二 实现 如下代码直接复制成.html文件打开即可预览效果 <!DOCTYPE ...

  4. Android中通过自定义签名控件实现手写签名

    场景 实现手写签名并获取签名照片 注: 博客: BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,SpringBoot,架构之路领域博主 关注公众号 霸道的程序猿 获取编 ...

  5. Android手写签名

    手写签名自定义实现,看注释就行了 package com.zhuzi.taobamboo.user_defined; import android.content.Context; import an ...

  6. Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.跟踪滑动轨迹实现手写签名 手写签名的原理是把手机屏幕当作画板,把用户手指当作画笔,手指在屏幕上划来划去,屏幕就会显示手指的移动轨迹,就像画笔在 ...

  7. Android手写签名功能(包含画米字格,人名和书写轨迹)

    本文主要介绍Android手写签名的功能实现,效果如下图 1.根据人名的个数绘制人的名称 这个逻辑分几个步骤:首先创建画笔,然后根据一个字,创建一个字的矩形框,然后根据矩形框获取到画这个字的宽高. / ...

  8. android 手写签批_Android自定义实现手写签名功能

    一.Android自定义View步骤 : 自定义属性: 选择和设置构造方法: 重写onMeasure()方法: 重写onDraw()方法: 重写onLayout()方法: 重写其他事件的方法(滑动监听 ...

  9. Android 将签名布局旋转90度,Android 自定义View手写签名

    Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器.看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为 ...

最新文章

  1. 程序员的幸福:上个月被裁拿赔偿,这个月找到涨薪50%的工作
  2. 第十四节: 介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。...
  3. zookeeper在搭建的时候,解决后台启动为standalone模式问题
  4. selenium之如何等待页面元素加载完成
  5. 数据库PHP绘制柱形图,php使用Jpgraph绘制柱形图的方法
  6. 飞天技术汇“2018云栖大会·上海峰会”专场,等你加入
  7. 怎样基于谷歌地图的Server缓存公布Image Service服务
  8. 广工android嵌入式系统试卷_嵌入式系统考试试题A及答案
  9. 我在中关村,给不了的你爱的国贸(ZZ)
  10. 【python】匿名函数与装饰器
  11. 单商户商城系统功能拆解13—分类管理
  12. IDEA 代码分析工具
  13. win10安装系统教程
  14. 关于vue组件引用外部Js数值和方法出现的问题
  15. 在office中插入特殊符号方框带√
  16. UltraScale时钟资源和时钟管理模块
  17. WS小世界网络构建实验(Matlab版)
  18. 管人管事必用的9个杀手锏
  19. 发票自动处理——摆脱纸张和数据输入的束缚,自动化工作流程和异常处理,大幅缩短审核准备时间
  20. 指数爆炸 体验幂的可怕

热门文章

  1. python制作冰花_自制冰花小学作文
  2. 密码学安全强随机数生成器_强密码学简介
  3. 不知名菜鸟的day13
  4. 如何正确推送镜像到私有仓库Harbor(http方式)
  5. ArcGIS依照谷歌地球空间校正
  6. Android 深入系统完全讲解(一)
  7. PVE7.0 CPU功耗调节
  8. DB2数据库游标使用总结
  9. python百分号用法_python里百分号
  10. 那些年交换友链遇到的奇葩