• Winform +OpenCvSharp更换证件照底色


    1. public partial class Form1 : Form
    2. {
    3. public Form1()
    4. {
    5. InitializeComponent();
    6. }
    7. private string selectedImagePath;
    8. Color backColor = Color.Empty;
    9. private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    10. {
    11. if ("tslSelectImage".Equals(e.ClickedItem.Name))
    12. {
    13. using OpenFileDialog openFileDialog = new OpenFileDialog();
    14. openFileDialog.Filter = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png";
    15. if (openFileDialog.ShowDialog() == DialogResult.OK)
    16. {
    17. selectedImagePath = openFileDialog.FileName;
    18. Image selectedImage = Image.FromFile(selectedImagePath);
    19. if (pictureBox1.Image != null)
    20. pictureBox1.Image.Dispose();
    21. pictureBox1.Image = selectedImage;
    22. if (backColor != Color.Empty)
    23. {
    24. ChangeImage(selectedImagePath, backColor);
    25. }
    26. }
    27. }
    28. else if ("tslSelectBackColor".Equals(e.ClickedItem.Name))
    29. {
    30. if (string.IsNullOrEmpty(selectedImagePath))
    31. {
    32. MessageBox.Show("请选择图像");
    33. return;
    34. }
    35. // 设置允许选择所有颜色
    36. colorDialog1.FullOpen = true;
    37. // 设置是否显示帮助按钮
    38. colorDialog1.ShowHelp = true;
    39. // 设置是否只显示纯色
    40. colorDialog1.SolidColorOnly = true;
    41. // 如果用户选择了颜色,更新Label控件的背景颜色
    42. if (colorDialog1.ShowDialog() == DialogResult.OK)
    43. {
    44. var color = colorDialog1.Color;
    45. backColor = color;
    46. ChangeImage(selectedImagePath, color);
    47. }
    48. }
    49. else if ("tslSave".Equals(e.ClickedItem.Name))
    50. {
    51. if (pictureBox2.Image != null)
    52. {
    53. // 创建FolderBrowserDialog对象
    54. FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
    55. // 设置对话框的描述文本
    56. folderBrowserDialog.Description = "选择保存图像的文件夹";
    57. // 显示对话框并检查用户是否点击了确定按钮
    58. if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
    59. {
    60. string folderPath = folderBrowserDialog.SelectedPath;
    61. string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";
    62. string filePath = Path.Combine(folderPath, fileName);
    63. try
    64. {
    65. pictureBox2.Image.Save(filePath);
    66. // 显示保存成功的消息框
    67. MessageBox.Show("文件保存成功!");
    68. }
    69. catch (Exception ex)
    70. {
    71. // 显示保存失败的消息框,并输出异常信息
    72. MessageBox.Show("文件保存失败:" + ex.Message);
    73. }
    74. }
    75. }
    76. }
    77. }
    78. private void ChangeImage(string path, Color color)
    79. {
    80. if (string.IsNullOrEmpty(selectedImagePath))
    81. {
    82. return;
    83. }
    84. var bytes = Change2(selectedImagePath, color);
    85. using (MemoryStream memoryStream = new MemoryStream(bytes))
    86. {
    87. if (pictureBox2.Image != null)
    88. pictureBox2.Image.Dispose();
    89. pictureBox2.Image = new Bitmap(memoryStream);
    90. }
    91. }
    92. private byte[] Change2(string path, Color color)
    93. {
    94. // 读取照片
    95. using Mat img = Cv2.ImRead(path);
    96. // 图片转换为灰度图
    97. using Mat hsv = new Mat();
    98. Cv2.CvtColor(img, hsv, ColorConversionCodes.BGR2HSV);
    99. // 假设背景颜色区域为图像左上角50x50的区域
    100. using Mat background = new Mat(hsv, new Rect(0, 0, 50, 50));
    101. Scalar mean = Cv2.Mean(background);
    102. // 图片的二值化处理
    103. int hRange = trackBar1.Value; // 默认色调范围
    104. int sRange = trackBar2.Value; // 默认饱和度范围
    105. int vRange = trackBar3.Value; // 默认亮度范围
    106. Scalar lower = new Scalar(mean.Val0 - hRange, mean.Val1 - sRange, mean.Val2 - vRange);
    107. Scalar upper = new Scalar(mean.Val0 + hRange, mean.Val1 + sRange, mean.Val2 + vRange);
    108. using Mat mask = new Mat();
    109. Cv2.InRange(hsv, lower, upper, mask);
    110. // 腐蚀膨胀
    111. using Mat erode = new Mat();
    112. Cv2.Erode(mask, erode, 1);
    113. using Mat dilate = new Mat();
    114. Cv2.Erode(erode, dilate, 1);
    115. // 颜色替换
    116. Scalar replaceColor = new Scalar(color.B, color.G, color.R);
    117. using Mat result = img.Clone();
    118. result.SetTo(replaceColor, dilate);
    119. // 将替换后的图像复制回原始图像
    120. result.CopyTo(img, dilate);
    121. return img.ToBytes();
    122. }
    123. private void trackBar1_Scroll(object sender, EventArgs e)
    124. {
    125. ChangeImage(selectedImagePath, backColor);
    126. }
    127. private void trackBar2_Scroll(object sender, EventArgs e)
    128. {
    129. ChangeImage(selectedImagePath, backColor);
    130. }
    131. private void trackBar3_Scroll(object sender, EventArgs e)
    132. {
    133. ChangeImage(selectedImagePath, backColor);
    134. }
    135. }

  • 相关阅读:
    Git 分布式版本控制工具
    Spring-boot项目练习笔记(二)MybatisPlus实现公共字段自动填充
    快递批量查询高手必备的实用工具
    HTTP响应详解, HTTP请求构造及HTTPS详解
    python到底是不是数据分析最好的语言
    MyBatis的缓存
    GaussDB技术解读系列:如何迁移到GaussDB?
    springboot项目打jar包的方法
    【Builder模式】C++设计模式——构建器
    MySQL的MHA高可用群集
  • 原文地址:https://blog.csdn.net/ftfmatlab/article/details/139413091