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);
}
}