C#WinformListView实现缺陷图片浏览器

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

行间距调整


[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;/// <summary>
/// y 左右间距,x 是上下间距
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetSpacing(Int16 x, Int16 y)
{SendMessage(listView1.Handle, LVM_SETICONSPACING, 0, x * 65536 + y);this.listView1.Refresh();
}

悬浮提示

鼠标悬浮与图片上方就可以显示以下内容:
$“总面积:{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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/151542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

财务数字化转型是什么?_光点科技

财务数字化转型是当今企业发展中的一项关键策略&#xff0c;旨在借助先进的数字技术&#xff0c;重新塑造和优化财务管理体系&#xff0c;以适应迅速变化的商业环境。这一转型不仅仅是技术的升级&#xff0c;更是对企业财务理念和流程的全面升级和改革。 财务数字化转型的核心在…

5.OsgEarth加载地形

愿你出走半生,归来仍是少年&#xff01; 在三维场景中除了使用影像体现出地貌情况&#xff0c;还需要通过地形体现出地势起伏&#xff0c;还原一个相对真实的三维虚拟世界。 osgEarth可通过直接加载Dem数据进行场景内的地形构建。 1.数据准备 由于我也没有高程数据&#xff0c…

云服务器搭建Zookeeper集群

文章目录 1.集群配置2.zookeeper的群起脚本3. Zookeeper节点的创建和删除相关4. Zookeeper的选举机制 1.集群配置 Zookeeper的集群个数最好保证是奇数个数&#xff0c;因为Zookeeper的选举过程有一个“半数机制”。 5台服务器&#xff0c;可以设置Zookeeper的集群为3或者5&…

【华为HCIP | 职业认证考试】821每日一刷

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零…

Jmeter压测实战:Jmeter二次开发之自定义函数

​1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数&#xff0c;方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函…

threejs(7)-精通粒子特效

一、初识Points与点材质 // 设置点材质 const pointsMaterial new THREE.PointsMaterial(); import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import gsa…

Kubernetes数据卷Volume和数据卷分类(emptyDir、nfs、hostPath、ConfigMap)详解

Kubernetes数据卷Volume和数据卷分类详解 数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&am…

Python爬虫(二十四)_selenium案例:执行javascript脚本

本章叫介绍如何使用selenium在浏览器中使用js脚本&#xff0c;更多内容请参考&#xff1a;Python学习指南 隐藏百度图片 #-*- coding:utf-8 -*- #本篇将模拟执行javascript语句from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdri…

数据清洗与规范化详解

数据处理流程&#xff0c;也称数据处理管道&#xff0c;是将原始数据转化为有意义的信息和知识的一系列操作步骤。它包括数据采集、清洗、转换、分析和可视化等环节&#xff0c;旨在提供有用的见解和决策支持。在数据可视化中数据处理是可视化展示前非常重要的一步&#xff0c;…

[减脂期食谱] 自制千岛酱

[减脂期食谱] 自制千岛酱 成品如下&#xff1a; 最中间的那个&#xff0c;算比较居中的颜色吧&#xff0c;其实自己家做原版的千岛酱还是比较简单的&#xff0c;它的底就是蛋黄酱(蛋黄油乳化的酱)&#xff0c;随后里面的材料比较自由&#xff0c;维基百科是这么介绍的&#xf…

【已解决】goland每次都自动删除我import的包

需要2步&#xff1a; 第一步&#xff1a;取消Optimize imports on the fly勾选 第二步&#xff1a;取消Optimize imports

【Linux08-进程信号】信号的一生……

今天&#xff0c;带来Linux下进程信号的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 生活中的信号 例子: 红绿灯来电铃声老妈倒数321叫我起床外卖小哥叫我下楼拿外卖 理解: 过程&#xff1a;收到信号 → 分析信号 → 产生信号对应的行为信号不一定会被立即处理&…