Winform +OpenCvSharp更换证件照底色

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private string selectedImagePath;
        Color backColor = Color.Empty;
        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            if ("tslSelectImage".Equals(e.ClickedItem.Name))
            {
                using OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    selectedImagePath = openFileDialog.FileName;
                    Image selectedImage = Image.FromFile(selectedImagePath);
                    if (pictureBox1.Image != null)
                        pictureBox1.Image.Dispose();
                    pictureBox1.Image = selectedImage;
                    if (backColor != Color.Empty)
                    {
                        ChangeImage(selectedImagePath, backColor);
                    }
                }
            }
            else if ("tslSelectBackColor".Equals(e.ClickedItem.Name))
            {
                if (string.IsNullOrEmpty(selectedImagePath))
                {
                    MessageBox.Show("请选择图像");
                    return;
                }
                // 设置允许选择所有颜色
                colorDialog1.FullOpen = true;
                // 设置是否显示帮助按钮
                colorDialog1.ShowHelp = true;
                // 设置是否只显示纯色
                colorDialog1.SolidColorOnly = true;
                // 如果用户选择了颜色,更新Label控件的背景颜色
                if (colorDialog1.ShowDialog() == DialogResult.OK)
                {
                    var color = colorDialog1.Color;
                    backColor = color;
                    ChangeImage(selectedImagePath, color);
                }
            }
            else if ("tslSave".Equals(e.ClickedItem.Name))
            {
                if (pictureBox2.Image != null)
                {
                    // 创建FolderBrowserDialog对象
                    FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();

                    // 设置对话框的描述文本
                    folderBrowserDialog.Description = "选择保存图像的文件夹";

                    // 显示对话框并检查用户是否点击了确定按钮
                    if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
                    {
                        string folderPath = folderBrowserDialog.SelectedPath;
                        string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";
                        string filePath = Path.Combine(folderPath, fileName);
                        try
                        {
                            pictureBox2.Image.Save(filePath);
                            // 显示保存成功的消息框
                            MessageBox.Show("文件保存成功!");
                        }
                        catch (Exception ex)
                        {
                            // 显示保存失败的消息框,并输出异常信息
                            MessageBox.Show("文件保存失败:" + ex.Message);
                        }
                    }
                }
            }
        }
        private void ChangeImage(string path, Color color)
        {
            if (string.IsNullOrEmpty(selectedImagePath))
            {
                return;
            }
            var bytes = Change2(selectedImagePath, color);
            using (MemoryStream memoryStream = new MemoryStream(bytes))
            {
                if (pictureBox2.Image != null)
                    pictureBox2.Image.Dispose();
                pictureBox2.Image = new Bitmap(memoryStream);
            }
        }
        private byte[] Change2(string path, Color color)
        {
            // 读取照片
            using Mat img = Cv2.ImRead(path);
            // 图片转换为灰度图
            using Mat hsv = new Mat();
            Cv2.CvtColor(img, hsv, ColorConversionCodes.BGR2HSV);
            // 假设背景颜色区域为图像左上角50x50的区域
            using Mat background = new Mat(hsv, new Rect(0, 0, 50, 50));
            Scalar mean = Cv2.Mean(background);
            // 图片的二值化处理
            int hRange = trackBar1.Value; // 默认色调范围
            int sRange = trackBar2.Value; // 默认饱和度范围
            int vRange = trackBar3.Value; // 默认亮度范围
            Scalar lower = new Scalar(mean.Val0 - hRange, mean.Val1 - sRange, mean.Val2 - vRange);
            Scalar upper = new Scalar(mean.Val0 + hRange, mean.Val1 + sRange, mean.Val2 + vRange);
            using Mat mask = new Mat();
            Cv2.InRange(hsv, lower, upper, mask);
            // 腐蚀膨胀
            using Mat erode = new Mat();
            Cv2.Erode(mask, erode, 1);
            using Mat dilate = new Mat();
            Cv2.Erode(erode, dilate, 1);
            // 颜色替换
            Scalar replaceColor = new Scalar(color.B, color.G, color.R);
            using  Mat result = img.Clone();
            result.SetTo(replaceColor, dilate);
            // 将替换后的图像复制回原始图像
            result.CopyTo(img, dilate);
            return img.ToBytes();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            ChangeImage(selectedImagePath, backColor);
        }

        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            ChangeImage(selectedImagePath, backColor);
        }

        private void trackBar3_Scroll(object sender, EventArgs e)
        {
            ChangeImage(selectedImagePath, backColor);
        }
    }

相关推荐

  1. C# 证件替换底色与设置背景图---PaddleSegSharp

    2024-06-06 15:54:06       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 15:54:06       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 15:54:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 15:54:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 15:54:06       18 阅读

热门阅读

  1. 【SAP HANA 34】HANA查找函数LOCATE的使用

    2024-06-06 15:54:06       8 阅读
  2. Mybatis学习之Spring boot整合Mybatis示例

    2024-06-06 15:54:06       8 阅读
  3. 什么是HTTPS协议,与HTTP协议有什么区别

    2024-06-06 15:54:06       9 阅读
  4. 【杂记-webshell恶意脚本木马】

    2024-06-06 15:54:06       7 阅读
  5. PTA R6-1 寻找链表元素的前驱结点

    2024-06-06 15:54:06       8 阅读
  6. 逆序数求解算法

    2024-06-06 15:54:06       6 阅读
  7. CSRF 令牌的生成过程和检查过程

    2024-06-06 15:54:06       7 阅读
  8. Xilinx FPGA 管脚的默认电平配置方法 XDC约束

    2024-06-06 15:54:06       9 阅读
  9. shell 支持多线程

    2024-06-06 15:54:06       7 阅读