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

  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. 为什么我劝你不要当数据科学家?
  2. 斗图必备!AI实战各种沙雕表情包分门别类~
  3. 机器人运动学_不同D-H矩阵的对比
  4. DL之SPP-Net:SPP-Net算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. 加密锁 vs. 云授权
  6. ACM MM 2018论文概述:基于多粒度监督的图像语义物体协同标注
  7. 蓝牙耳机芯片检测软件_安凯微推出TWS真无线蓝牙5.0耳机芯片
  8. FreeRTOS互斥锁
  9. 音速索尼克 怪人_如何使用AI玩刺猬索尼克。 真干净!
  10. python入门学校_如何学习Python,以及新手如何入门?
  11. android升级mcu升级,车载mcu需要升级吗_车载mcu升级有什么用
  12. 你肯定用过手机护眼模式, 但你知道怎么将电脑Win10窗口背景色修改为护眼的淡绿色吗?(附带如何备份注册表)
  13. Win7笔记本开启WiFi
  14. Mysql 隐式类型转换
  15. 计算机如何恢复桌面,如何恢复电脑原始桌面
  16. (java版)删除重复值阿伟学长在开发一款游戏, 他希望玩家已经获得的道具会降低爆率, 避免玩家获得太多重复的道具但玩家背包中道具是乱序且不确定的, 为了减小判断的运算量, 需要先对数据进行去重.
  17. 学习使用js链接websocket服务断线重连的方法
  18. 算法设计与分析:Minimum Number of Refueling Stops(Week 11)
  19. QQ侧滑菜单的实现和拓展-DrawerLayout
  20. Java编写五线谱上的音符_干货| 认识五线谱上的音符!

热门文章

  1. 电脑连不上WIFI 显示地球图标
  2. MICCAI 2022:基于 MLP 的快速医学图像分割网络—UNeXt
  3. 微信群里好玩的互动游戏有哪些?微信营销互动游戏盘点
  4. 小公司的坑,能躲一个是一个!
  5. Mario城堡历险记【BFS】
  6. oa系统服务器ip地址,oa服务器的ip地址
  7. ui动效 unity_针对Unity3D的小游戏UI框架——IceCreamView
  8. 2015年,移动互联网进入拼“活跃度”时代
  9. The Google File System 中文版论文(上)(转载)
  10. html5直选框,HTML 5 area 标签