C#实时监控指定文件夹中的动态,并将文件夹中生成的新图片显示在界面上(相机采图,并且从本地拿图)

源码:

单窗口

从本地实时拿图显示到窗口中并接收tcp发送的信号转为字符串显示在窗体中实现检测可视化资源-优快云文库

双窗口

C#中从本地(两个路径文件夹)中实时拿图显示到窗口中并接收(两个tcp发送的信号)转为字符串显示在窗体中实现检测可视化-优快云博客

结果展示

此类原理适用于文件夹中自动生成图片,并提取最新生成的图片将其显示,

如果你是相机采图将其保存到本地,可以用这中方法可视化,并将检测的结果和图片匹配

理论上任何文件都是可以监视并显示的,我这里只是做了一个图片的实例。

用vs2022或者其他的C#编写软件,创建一个winform程序

界面可以随意设计

主流程代码实例参考

private void btnStart_Click1(/*object sender, EventArgs e*/)
{
    // 创建FileSystemWatcher
    try
    {
        watcher = new FileSystemWatcher
        {
            Path = Path0,
            Filter = "*.bmp", // 可以根据需要修改为其它格式,如 *.png

            NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite
        };
        //richTextBox2.Text = "开始监听……………………………………\n";
        log.AddInLog("开始监听……………………………………\n");
        // 订阅事件
        watcher.Created += OnNewImageAdded;
        
        // 启动监视器
        watcher.EnableRaisingEvents = true;

        //this.Load += (s,e) => LoadImages();
    }
    catch (Exception)
    {

        log.AddInLog("请确认输入的图片格式或者读取路径是否有误!!!");
    }
               
}

监视事件并且触发显示样本部分

private  void ShowNextImage()
{
    watch.Restart();
    if (imageFiles.Length == 0) return;

    currentIndex = (currentIndex + 1) % imageFiles.Length; // 循环显示图片
    var imagePath = imageFiles[currentIndex];

    var latestImage = imageFiles.LastOrDefault();

    while (true)
    {
        if (File.Exists(latestImage))//判断文件是否存在 为了保险 实际消息触发文件必存在
        {

            long fileSize = new FileInfo(latestImage).Length;

            Thread.Sleep(20);

            if (fileSize > 0.02 * 1024 * 1024)  //MB转化为字节 判断当前文件大小

            {

                Thread.Sleep(500);//在等一会
                break;
            }
        }
        else
        {
            break;
        }
    }
    //await Task.Delay(100);
    //string ss = "E:\\AING\\Sick\\TESTIMAGE\\1\\1.bmp";
    Bitmap map = new Bitmap(latestImage);
    int width1 = 960;
    int height1 = 1280;
    Bitmap mapsizes = ResizeImage(map, width1, height1);
    //mapsizes.Save("E:\\AING\\Sick\\TESTIMAGE\\2\\9.jpg");
    // 显示最新添加的图片
    if (!string.IsNullOrEmpty(latestImage))
    {
        pictureBox1.Image?.Dispose();
        pictureBox1.Image = mapsizes;                
        watch.Stop();
        //ReceiveDataAsync();
        //if (message == "OK")
        //{
        //    richTextBox1.Text = message;
        //    richTextBox1.BackColor = Color.GreenYellow;
        //}
        //else if (message == "NG")
        //{
        //    richTextBox1.Text = message;
        //    richTextBox1.BackColor = Color.Red;
        //}

        //richTextBox2.Text = watch.ElapsedMilliseconds.ToString() + "   ms";
        //richTextBox2.Text = "最新样本路径: " + latestImage + " \n样本检测反馈结果:    \n" + message + "\n\n" + "Time:" + watch.ElapsedMilliseconds.ToString() + "   ms";

        log.AddInLog("新样本:\n" + latestImage);
        log.AddInLog("样本反馈:" + message);
        log.AddInLog("时间:" + watch.ElapsedMilliseconds.ToString());
    }
}

 链接tcp接收结果字符串部分

private void MCProtocolLibTest()
{
    try
    {
        client = new TcpClient("192.168.0.2", 5000); // 服务器地址和端口
        stream = client.GetStream();
        log.AddInLog("192.168.0.2 连接成功…… \n");
        // 开始接收数据                
        //Thread.Sleep(1000);
        ReceiveDataAsync();


    }
    catch (Exception)
    {

        richTextBox2.Text = "192.168.0.2 连接失败…… \n";
    }
}
private async Task ReceiveDataAsync()
{
    byte[] buffer = new byte[1024];
    int bytesRead;

    try
    {
        while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
        {
            message = Encoding.UTF8.GetString(buffer, 0, bytesRead);

            if (message == "OK")
            {
                richTextBox1.Text = message;
                richTextBox1.BackColor = Color.GreenYellow;
            }
            else if (message == "NG")
            {
                richTextBox1.Text = message;
                richTextBox1.BackColor = Color.Red;
            }
            
            //message = displayText;
            //UpdateLabel(message); // 更新Label控件
        }
    }
    catch (Exception ex)
    {
        richTextBox1.Text = "数据接收出现问题……";
        //MessageBox.Show("接收数据时出现错误: " + ex.Message);
    }
}
private void UpdateLabel(string message)
{
    if (richTextBox2.InvokeRequired)
    {
        richTextBox2.Invoke(new Action<string>(UpdateLabel), message);
    }
    else
    {
        richTextBox2.Text += message + Environment.NewLine; // 显示接收到的消息
    }
}

 样本多了可能导致内存盘崩盘 所以你可以设置一个每周一提示是否删除文件夹中的所有图片

private void Form1_Load2(/*object sender, EventArgs e*/)
{
    // 检查当前日期是否为周一
    if (DateTime.Today.DayOfWeek == DayOfWeek.Monday)
    {
        // 显示删除确认对话框
        DialogResult result = MessageBox.Show("今天是周一是否清空文件夹中采集的样本!!!", "删除确认", MessageBoxButtons.YesNo);

        if (result == DialogResult.Yes)
        {
            // 指定文件夹路径
            string folderPath = Path0;

            // 删除文件夹中的所有图片文件
            if (Directory.Exists(folderPath))
            {
                string[] files = Directory.GetFiles(folderPath, "*.bmp");

                foreach (string file in files)
                {
                    File.Delete(file);
                }

                MessageBox.Show("图片删除成功!");
            }
            else
            {
                MessageBox.Show("指定文件夹不存在!");
            }
        }               
    }

如果你用的是我的源码 那你需要知道几处地方进行修改

路径:

这个是你文件夹的路径

图片格式:

样本大小:

这里你需要修改

如果你文件夹中是0.37MB的大小就需要改为 0.2  比你样本大小   小就可以

服务器的端口和ip

 

删除图片

你可以设置你需要的天数  进行删除图片,我在这里是每次打开就删除15天前的图片,不然本地容易崩

如果你不想要这个  那你直接把值写大   -999999999999999999  改成删除一百年前的图片也行,理论上不会删除任何图片

 Log设置:

打开log.cs

修改这里的路径默认是把log保存到debug中,注意这个不会自动生成log文件夹 需要你手动创建一个

会保存为txt文件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

该醒醒了~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值