1前言

    我们在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以前照了张蓝底的。这时候你想换个底色,于是在百度上一搜“证件照换底色”,出来了一堆photoshop 教程,程序员可以找公司美工帮个忙,但是一般人就很纠结了,所以呢我就花了半天的功夫写了一个小软件,简化大家的操作难度,哎!现在越来越发现会写点程序真好。O(∩_∩)O哈哈~

2.实现思路

(1)首先说一下像素的组成RGB

当前展示白色的RGB值是255,255,255,相反黑色的RGB就是0,0,0,  其他颜色就是0~255的RGB颜色组合。我们就是通过颜色的RGB值得范围来替换证件照底色的。

(2要过滤底色的RGB范围选择)

我们一般拍照的时候后面都有一块幕布做底色,但是由于曝光和幕布底色的稍微的不同,导致背景其实是一个颜色范围,而非单一的颜色,这就要求我们必须找出这个范围,我这里选择前五排的像素作为初始过滤的颜色范围。下面就是代码获取这个颜色范围。

        /// <summary>/// 获取前五排像素,求出rgb范围/// </summary>/// <param name="path"></param>/// <returns></returns>private List<int> GetModeColor(string path){List<int> colorrgb = new List<int>();List<int> rlist=new List<int>();List<int> glist = new List<int>();List<int> blist = new List<int>();using (Bitmap map = (Bitmap)Image.FromFile(path)){using (Bitmap editMap = new Bitmap(map, map.Width, map.Height)){// editMap.GetPixel()for (int i = 0; i < map.Width; i++){for (int j = 0; j <5; j++){Color color = editMap.GetPixel(i, j);if (!rlist.Contains(color.R)){rlist.Add(color.R);}if (!glist.Contains(color.G)){glist.Add(color.G);}if (!blist.Contains(color.B)){blist.Add(color.B);}}}//添加rgb像素范围
                    colorrgb.Add(rlist.Max());colorrgb.Add(glist.Max());colorrgb.Add(blist.Max());colorrgb.Add(rlist.Min());colorrgb.Add(glist.Min());colorrgb.Add(blist.Min());}}return colorrgb;}

(3头部和身体进行分开处理)

由于我们的头发偏黑色,若要达到很好的处理效果必须进行对头部做更大范围的颜色处理,这里我们加入了一个选择条,让用户进行分区域进行微调,在文本框中输入要调整颜色范围数值,达到最好的效果。

(4背景颜色移除与替换)

        我们通过对证件照从左到右,从上到下一行一行的对颜色进行过滤,把与我们设置颜色范围内的像素移除并替换成我们的想要的背景色,经过微调,最大程度的实现颜色的替换而不失去本该保留部分。这也是本工具的最核心代码。

 /// <summary>/// 预览结果/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(label1.Text)){MessageBox.Show("请选择颜色");return;}if (string.IsNullOrEmpty(imagePath)){MessageBox.Show("请上传证件");return;}int upnum = Convert.ToInt32(textBox1.Text);int downnum = Convert.ToInt32(textBox2.Text);double trackvalue = Convert.ToDouble(trackBar1.Value);List<int> colorrgb = GetModeColor(imagePath);//上半部分去除颜色范围List<int> upcolorrgb = new List<int>();//下半部分去除颜色范围List<int> downcolorrgb = new List<int>();for (int i = 0; i < colorrgb.Count; i++){if (i>2){upcolorrgb.Add(colorrgb[i]-upnum<0?0: colorrgb[i] - upnum);downcolorrgb.Add(colorrgb[i] - downnum < 0 ? 0 : colorrgb[i] - downnum);}else{upcolorrgb.Add(colorrgb[i] + upnum >255 ? 255 : colorrgb[i] + upnum);downcolorrgb.Add(colorrgb[i] + downnum > 255 ? 255 : colorrgb[i] + downnum);}}//从左到右,从上到下读取像素点using (Bitmap map = (Bitmap)Image.FromFile(imagePath)){using (Bitmap editMap = new Bitmap(map, map.Width, map.Height)){// 上半部分for (int i = 0; i < map.Width; i++){for (int j = 0; j < (int)(map.Height * (trackvalue/100)); j++){Color color = editMap.GetPixel(i, j);//判断像素是否可以移除if (color.R >= upcolorrgb[3] && color.R <= upcolorrgb[0] &&color.G >= upcolorrgb[4] && color.G <= upcolorrgb[1] &&color.B >= upcolorrgb[5] && color.B <= upcolorrgb[2]){editMap.SetPixel(i, j, tempcolor);}}}//下半部分for (int i = 0; i < map.Width; i++){for (int j = (int)(map.Height * (trackvalue / 100)); j <map.Height ; j++){//判断像素是否可以移除Color color = editMap.GetPixel(i, j);if (color.R >= downcolorrgb[3] && color.R <= downcolorrgb[0] &&color.G >= downcolorrgb[4] && color.G <= downcolorrgb[1] &&color.B >= downcolorrgb[5] && color.B <= downcolorrgb[2]){editMap.SetPixel(i, j, tempcolor);}}}//保存string savepath = System.Environment.CurrentDirectory+@"\result\" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".png";editMap.Save(savepath);resultPath = savepath;pictureBox2.Image = Image.FromFile(savepath);}}}

3.软件操作

(0系统界面)

(1打开证件照)

由于本人太丑,这里在网上找了张美女的证件照,来做演示。

(2选择替换后的背景色)

点击-打开选择颜色,选择想要的背景色,

(3预览初始效果)

点击预览,便可看到最初的处理效果。

(4微调)

调节滑块,将图像分为上下两部分分开进行处理,调节参数(范围0-255都行),参数值越大移除的细节越多,仔细调参数可以把头部保留更多细节。

换个红色看看效果

(5导出)

点击导出成果就可以啦。这里就不放图了。完毕

4.总结

       可能存在的一点小问题就是衣服的颜色和背景相似,可能会被误移除,一般的情况都会有比较满意的效果。这是我2018年的第一篇小文章,一步步实现自己的小目标。希望大家多多支持。下面是软件和源码的下载。

源码:https://pan.baidu.com/s/1kVBvUD5

工具程序:https://pan.baidu.com/s/1nvxKFeL

作者:ATtuing

出处:http://www.cnblogs.com/ATtuing

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

转载于:https://www.cnblogs.com/ATtuing/p/8228396.html

c#实现超实用的证件照换底色小工具相关推荐

  1. 推荐一个快速证件照换底色的工具超级好用

    推荐一个快速证件照换底色的工具超级好用 www.yzcopen.com/img/idphoto 选择好图片转换 下载无水印照片即可 方便着急和不会ps的朋友 不去摄影棚,不用PS

  2. 【零基础微信小程序】基于百度大脑人像分割的证件照换底色小程序实战开发

    系列文章目录 [零基础微信小程序入门开发]小程序介绍及环境搭建 [零基础微信小程序入门开发]配置小程序 [零基础微信小程序入门开发]小程序框架一 [零基础微信小程序入门开发]小程序框架二 [零基础微信 ...

  3. 怎么给证件照换底色?这四个免费方法一看就会

    分享5种可以给证件照换底色的工具,操作简单,一键更换证件照底色,而且有电脑软件和手机APP,让你随时随地都能修改证件照底色! 1.画图3D(电脑自带软件) 一个Windows系统中自带的绘画软件,用它 ...

  4. 用Matlab搞了个小工具,以后给你女朋友的证件照换底色再也不用发愁了

    证件照换底色这件事在生活中并不是很频繁,然而,当你手上只有一种底色的照片,遇到找工作,填表或者在线上传某种要求必须为指定底色的证件照时,却又很重要. 我想更重要的莫过于,有一天你的女朋友突然要你给她的 ...

  5. 我的小程序新增了证件照换底色功能

    点击上方蓝字"优派编程"选择"加为星标",第一时间关注原创干货 原文地址 http://wp.fang1688.cn/study/646.html 我的小程序新 ...

  6. 微信小程序--证件照换底色UI及前端页面修改+札记与贺卡图片整理

    札记与贺卡 主要是进行所需要的海报的选择,修改和收集.因为是一个模板类的小程序,用户选择我们设定的模板之后,进行文字的添加,所以我们这边模板的多样性很重要,也因为是双节比较特别,就收集了各类的模板海报 ...

  7. 微信小程序--证件照换底色项目前端修改+头像框项目前端页面实现修改

    证件照换底色 主要进行后端所需功能的增加,尺寸选择功能的增加,颜色选择功能样式修改,版权问题导致的ui修改和所需ui的设计. 跳转前按钮判断 在点击开始转换图片进行跳转之前,判断用户是否已经进行授权, ...

  8. java面试换背景颜色_证件照换底色 证件照换背景 证件照背景颜色

    很多人都不知道怎么让证件照换底色,如果单位要求要红底证件照,而你手里只有蓝底的,怎么办?下面小编就来教你,怎么给证件照换底色换背景颜色. 小美智能证照小程序可以在线拍摄制作证件照,还支持证件照换底色, ...

  9. 对比Python,看看Excel如何3步给证件照换底色?

    公众号后台回复"图书",了解更多号主新书内容 作者:黄伟呢 来源:数据分析与统计学之美 Python完成证件照换底色 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交 ...

最新文章

  1. PowerDesigner导入MySQL数据库表
  2. html ios视频播放器,良心推荐!iOS端的视频播放应用
  3. 【转】开源的C# websocket-sharp组件解析
  4. mysql 全局不重复_php uniqid() 通过MYSQL实现全局不重复的唯一ID
  5. android layout.inflater,Android - LayoutInflater
  6. python工程师干什么的_大数据开发工程师薪资待遇及招聘要求?
  7. FastStone Capture—截图功能
  8. 昂达v891w可以用u盘linux,拆机小能手——ONDA 昂达 V891w CH 双系统电脑国产平板 拆解清灰!...
  9. linux mint 图标主题_Ubuntu/Linux Mint 用上仿 Win7/Win8 主题
  10. cocos creator 微信小游戏 世界排行榜制作教程(云数据库)
  11. 服务器远程训练,远程服务器 Linux 用cityscape训练DeepLabv3模型(Pytorch版)
  12. 帝国php改密码后登录不进去,帝国CMS安装,后台,登陆,密码常见问题汇总
  13. css图片颜色设置为黑白
  14. 支付宝B2C转账流程
  15. 复选框checkbox实现批量删除
  16. mysql 实现批量添加和更新功能
  17. 亚马逊云科技联合学而思网校,共同开发AI启蒙课程
  18. 驾照科目一知识点——1、准驾车型
  19. pycharm Failed to connect to github.com port 443: Timed out
  20. 在Teams团队中快速添加SharePoint Online站点

热门文章

  1. 做站赚钱的个人实战经验
  2. 亚马逊vs沃尔玛:5000亿美元的印度之战
  3. 廉政公署如何查前一哥
  4. PHP如何将图像转换为base64编码格式
  5. 输出100~1000内的所有素数python
  6. linux touch 文件,linux文件之touch命令及文件时间戳
  7. windows脚本命令编写
  8. Java泛型类与泛型函数
  9. 用户认购定期存款预测R语言实现
  10. dnf小区最多的服务器,dnf最强服务器出炉, 深渊史诗百分百爆率, 一天直升满级...