C# 证件照替换底色与设置背景图---PaddleSegSharp
PaddleSegSharp 是一个基于百度飞桨PaddleSeg项目的人像分割模块而开发的.NET的工具类库。
PaddleSegSharp 中PaddleSeg.dll文件是基于开源项目最新发布版本PaddleSeg PaddleSeg的版本修改而成的C++动态库,基于opencv的x64编译而成的。
PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥感、娱乐等场景落地应用。
本项目只能在X64的CPU上编译和使用,只能在avx指令集上的CPU上使用,目前仅支持windows平台。
PaddleSegSharp 支持飞桨人像抠图的所有模型。PP-MattingV2-512、PP-Matting-512、PP-Matting-1024、PP-HumanMatting、MODNet-MobileNetV2。 默认使用MODNet-MobileNetV2模型。
1、新建winform项目
2、添加引用PaddleSegSharp ,使用NuGet 搜索添加PaddleSegSharp
3、窗体上添加图片显示控件以及按钮
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using PaddleSegSharp; namespace WindowsFormzhengjian { public partial class Form1 : Form { #region 字段 private string[] bmpFilters = new string[] { ".bmp", ".jpg", ".jpeg", ".tiff", ".tif", ".png" }; private string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png"; private PaddleSegMattingEngine engine; MattingParameter parameter; string modelPath = null; string path = Environment.CurrentDirectory + @"\out\"; /// <summary> /// 创建画布的画板背景 /// </summary> Bitmap backgroundImage = null; #endregion public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //初始化 引擎 engine = new PaddleSegMattingEngine(); //参数 parameter = new MattingParameter(); //parameter.outbgfile = true;//输出mask图 //parameter.bgtransparent = true;//背景透明 engine.Init(modelPath, parameter); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } /// <summary> /// 选择图片 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSelectPic_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = fileFilter; if (ofd.ShowDialog() == DialogResult.OK) { //pictureBox1.Image = new Bitmap(ofd.FileName); using (FileStream ms = File.OpenRead(ofd.FileName)) { //解决内存异常问题,以及this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms)导致的一般性gdi+ 问题 using (Bitmap bt = new Bitmap(ms)) { #region MyRegion //backgroundImage = new Bitmap(bt.Width, bt.Height); ////Graphics g = pbx.CreateGraphics(); //Graphics g = Graphics.FromImage(backgroundImage); ////g.DrawLine(Pens.Black, startPoint, e.Location); ////g.Clear(Color.White); ////Pen myPen = new Pen(Color.Black, int.TryParse(ConfigurationManager.AppSettings["penwidth"], out int penwidth) ? penwidth : 3); //g.SmoothingMode = SmoothingMode.AntiAlias; //g.CompositingQuality = CompositingQuality.HighQuality; //g.CompositingMode = CompositingMode.SourceOver; //g.DrawImage(bt, bt.Width, bt.Height); ////PointF pointFstart = PointToPointF(startPoint); ////PointF pointFend = PointToPointF(e.Location); ////g.DrawBeziers(myPen, new PointF[] { pointFstart, pointFend }); //pbx.BackgroundImage = backgroundImage; //g.Dispose(); bt.Save("Fing.jpg"); ////this.pbx.BackgroundImage = System.Drawing.Image.FromStream(ms); #endregion backgroundImage = new Bitmap(bt.Width, bt.Height, bt.PixelFormat); Graphics g = Graphics.FromImage(backgroundImage); g.SmoothingMode = SmoothingMode.AntiAlias; g.CompositingQuality = CompositingQuality.HighQuality; g.CompositingMode = CompositingMode.SourceOver; g.DrawImage(bt, 0, 0); backgroundImage.Save("Finge.jpg"); //pictureBox1.Image = Image.FromHbitmap(backgroundImage.GetHbitmap()); pictureBox1.Image = backgroundImage; g.Dispose(); pictureBox1.Refresh(); } } #region ok ////参数 //MattingParameter parameter = new MattingParameter(); ////初始化引擎 //PaddleSegMattingEngine engine = new PaddleSegMattingEngine(); //engine.Init(modelPath, parameter); ////设置背景颜色 //engine.Setbackground(45, 145, 255); ////分割后的文件 //string outfile = Guid.NewGuid().ToString() + ".png"; //string outbgfile = Path.GetFileNameWithoutExtension(outfile) + "_bg.png"; //engine.Seg(ofd.FileName, outfile, outbgfile); #endregion } this.Refresh(); } /// <summary> /// 替换背景色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnReplaceBackground_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { ////参数ok //MattingParameter parameter = new MattingParameter(); ////初始化引擎 //PaddleSegMattingEngine engine = new PaddleSegMattingEngine(); //engine.Init(modelPath, parameter); ////设置背景颜色 //Color bgcolor = Color.White; //ColorDialog colorDialog = new ColorDialog(); //colorDialog.Color = bgcolor; //if (colorDialog.ShowDialog() != DialogResult.OK) return; //bgcolor = colorDialog.Color; //engine.Setbackground(bgcolor.R, bgcolor.G, bgcolor.B); ////engine.Setbackground(45, 145, 255); ////分割后的文件 //string outfile = Guid.NewGuid().ToString() + ".png"; //string outbgfile = Path.GetFileNameWithoutExtension(outfile) + "_bg.png"; ////engine.Seg("小一寸.png", outfile, outbgfile); ////engine.Seg(new Bitmap("小一寸.png"), outfile, outbgfile); //engine.Seg(pictureBox1.Image, outfile, outbgfile); engine = new PaddleSegMattingEngine(); engine.Init(modelPath, parameter); Color bgcolor = Color.White; ColorDialog colorDialog = new ColorDialog(); colorDialog.Color = bgcolor; if (colorDialog.ShowDialog() != DialogResult.OK) return; bgcolor = colorDialog.Color; engine.Setbackground(bgcolor.R, bgcolor.G, bgcolor.B); //engine.SetbackgroundFile(""); string outfile = path + Guid.NewGuid().ToString() + ".png"; string outbgfile = path + Path.GetFileNameWithoutExtension(outfile) + "_bg.png"; engine.Seg(pictureBox1.Image, outfile, outbgfile); //engine.Setbackground(45, 145, 255); ////分割后的文件 //string outfile = "C:\\" + Guid.NewGuid().ToString() + ".bmp"; //engine.Seg("C:\\Users\\Administrator\\Desktop\\1.jpg", outfile, "mask图路径"); pictureBox2.Image = new Bitmap(outfile); } } /// <summary> /// 替换背景图 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSetBackground_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { engine = new PaddleSegMattingEngine(); engine.Init(modelPath, parameter); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = fileFilter; if (ofd.ShowDialog() != DialogResult.OK) return; engine.SetbackgroundFile(ofd.FileName); string outfile = path + Guid.NewGuid().ToString() + ".png"; string outbgfile = path + Path.GetFileNameWithoutExtension(outfile) + "_bg.png"; //string outfile = path + "1.png"; //string outbgfile = path + "1_bg.png"; engine.Seg(pictureBox1.Image, outfile, outbgfile); pictureBox2.Image = new Bitmap(outfile); } } private void btnSave_Click(object sender, EventArgs e) { if (pictureBox2.Image != null) { SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Filter = "Image files (JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png|" + "JPeg files (*.jpg;*.jpeg)|*.jpg;*.jpeg |GIF files (*.gif)|*.gif |BMP files (*.b" + "mp)|*.bmp|Tiff files (*.tif;*.tiff)|*.tif;*.tiff|Png files (*.png)| *.png |All f" + "iles (*.*)|*.*"; if ((fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)) { string path = fileDialog.FileName.ToString(); pictureBox2.Image.Save(path); } } } private void btnOCR_Click(object sender, EventArgs e) { //OpenFileDialog ofd = new OpenFileDialog(); //ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png"; //if (ofd.ShowDialog() != DialogResult.OK) // return; //var imagebyte = File.ReadAllBytes(ofd.FileName); //Bitmap bitmap = new Bitmap(new MemoryStream(imagebyte)); //OCRModelConfig config = null; //OCRParameter oCRParameter = new OCRParameter(); //OCRResult ocrResult = new OCRResult(); //using (PaddleOCREngineengine = new PaddleOCREngine(config, oCRParameter)) //{ // ocrResult = engine.DetectText(bitmap); //} //if (ocrResult != null) //{ // MessageBox.Show(ocrResult.Text, "识别结果"); //} } } }
龙腾一族至尊龙骑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2018-05-29 Chrome插件 postman的使用方法详解!最全面的教程
2018-05-29 postman发送json请求,使用案例
2015-05-29 JavaScript Function.apply() 函数详解
2015-05-29 window.addEventListener来解决让一个js事件执行多个函数