• C#&Winform&ListView实现缺陷图片浏览器


    C#&Winform&ListView实现缺陷图片浏览器

    功能需求

    机器视觉检测系统中特别是缺陷检测系统,通常需要进行对已经检出的缺陷图片进行浏览查阅。主要是通过条件筛选查询出所需要的数据,进行分页再展示到界面中。
    预期功能:

    • 条件查询:通过不同的条件查询需要展示的检测记录数据
    • 数据分页:页面大小有限,控制数据来源,对数据进行分页
    • 图像展示:以平铺的方式展示图像
    • 数据提示:鼠标移动到图片上显示其他详细信息
    • 原图查看:点击查看原始大图

    本文使用Winform&ListView实现图像展示和数据提示这部分功能需求,效果如下所示:
    效果图像

    图像浏览

    界面上需要放置一个ListView控件和一个ImageList对象。
    我们是要平铺显示大图,设置ListView空间的View属性为LargeIcon,说大也不够大,只有256*256。

    具体实现过程就是:
    1 查询到数据;
    2 遍历数据源将图像数据填充到ImageList对象,同时设置ListView的listViewItem集合
    3 传递给ListView来展示。

    注意:
    1 图像失真:设置 imageList.ColorDepth = ColorDepth.Depth32Bit;
    2 图像大小:ImageSize.Height或者ImageSize.Width应介于 1 和 256 之间。

    private void uiPagination1_PageChanged(object sender, object pagingSource, int pageIndex, int count)
    {
        try
        {
            List<DefectResultDetails> data = new List<DefectResultDetails>();
            if (datas == null)
            {
                return;
            }
            for (int i = (pageIndex - 1) * count; i < (pageIndex - 1) * count + count; i++)
            {
                if (i >= datas.Count) continue;
                data.Add(datas[i]);
            }
            int index = 0;
            listView1.Clear();
            imageList = new ImageList();
            imageList.ImageSize = new Size(256, 130);
            //彩色图像需要设置,否则图像会失真
            imageList.ColorDepth = ColorDepth.Depth32Bit;
            
            foreach (var item in data)
            {
                imageList.Images.Add(Bitmap.FromFile(item.Path));
                ListViewItem listViewItem = new ListViewItem();
                listViewItem.ImageIndex = index;
                listViewItem.Tag = $"{item.Path.Split('\\')[4]}-{item.Path.Split('\\')[5].Split('.')[0]}";
                listViewItem.Text = $"{item.Path.Split('\\')[4]}-{item.Path.Split('\\')[5].Split('.')[0]}";
                //使用该方法要将控件的 ShowItemTttlTips设置为True
                //listViewItem.ToolTipText = $"总面积:{item.Area} 最大高度:{item.Height} 最大宽度:{item.Width} 是否报警:{item.IsAlarm}";
                listViewItem.SubItems.Add($"总面积:{item.Area} 最大高度:{item.Height} 最大宽度:{item.Width} 异物个数:{item.Count} 是否报警:{item.IsAlarm}");
                // 为了在点击时预览原始图像,从这里可以拿到图像的绝对路径
                listViewItem.SubItems.Add($"{item.Path}");
                listView1.Items.Add(listViewItem);
                index++;
            }
            listView1.LargeImageList = imageList;
            //调整显示内容之间的行间距留白
            SetSpacing(170, 319);
        }
        catch (Exception ex)
        {
            Logger.Logger.Error($"{ex}");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    行间距调整

    
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    const int LVM_FIRST = 0X1000;
    const int LVM_SETICONSPACING = LVM_FIRST + 53;
    
    /// 
    /// y 左右间距,x 是上下间距
    /// 
    /// 
    /// 
    public void SetSpacing(Int16 x, Int16 y)
    {
        SendMessage(listView1.Handle, LVM_SETICONSPACING, 0, x * 65536 + y);
        this.listView1.Refresh();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    悬浮提示

    鼠标悬浮与图片上方就可以显示以下内容:
    $“总面积:{item.Area} 最大高度:{item.Height} 最大宽度:{item.Width} 异物个数:{item.Count} 是否报警:{item.IsAlarm}”

    private void listView_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
    {
        ToolTip toolTip = new ToolTip();
        string itemInfor = e.Item.SubItems[1].Text;
        toolTip.SetToolTip((e.Item).ListView, itemInfor);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    软考高级系统架构设计师系列之:案例分析典型试题四
    服务领域模型
    Maven3.6.2安装详细教程
    浅谈IOC&&DI
    彻底删除Ubuntu双系统(联想小新2022)
    8.查询数据
    fork函数相关资源复制问题验证
    讲解LCD1602自定义字符原理
    java 同学聚会AA制共享账单系统springboot 小程序022
    C++如何监控键盘输入输出
  • 原文地址:https://blog.csdn.net/Charwee_/article/details/134090491