当前位置: 首页 > news >正文

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。

方法签名

public static string GetMonitorFriendlyName(bool isPrimary)

方法概述

GetMonitorFriendlyName 方法用于获取指定显示器的友好名称。参数 isPrimary 指定是否获取主显示器的友好名称。

实现原理

  1. 先获取显示设备的目标设备信息和源设备信息,再将目标设备信息(友好名称)和源设备信息(逻辑设备名称)关联起来
  2. 获取要求获取屏幕(主/副屏)的信息(包含逻辑设备名称)
  3. 通过逻辑设备名称关联,再找到相应屏幕的友好名称

实现细节

1. 获取屏幕信息:

    var screen = ScreenHelper.GetScreen(isPrimary);

2. 获取目标设备名称:

    var targetDeviceNames = GeTargetDeviceNames();

调用 GeTargetDeviceNames 方法获取所有活动路径的目标设备名称和源设备名称。

3. 匹配屏幕设备名称:

    return targetDeviceNames.FirstOrDefault(m => m.Item2.viewGdiDeviceName.EqualsIgnoreCase(screen.DeviceName)).Item1.monitorDevicePath;

核心方法

GeTargetDeviceNames 方法: 该方法获取所有活动路径的目标设备名称和源设备名称,并将目标设备名称和源设备名称相匹配。其实现涉及调用 Windows API 函数 GetDisplayConfigBufferSizes 和 QueryDisplayConfig,并解析返回的显示配置信息。

/// <summary>
/// 获取显示器FriendlyName名称
/// </summary>
/// <returns></returns>public static IEnumerable<(DISPLAYCONFIG_TARGET_DEVICE_NAME, DISPLAYCONFIG_SOURCE_DEVICE_NAME)>GeTargetDeviceNames(){List<(DISPLAYCONFIG_TARGET_DEVICE_NAME, DISPLAYCONFIG_SOURCE_DEVICE_NAME)> listRet = new();try{int error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,out var pathCount, out var modeCount);if (error != ERROR_SUCCESS)throw new Win32Exception(error);DISPLAYCONFIG_PATH_INFO[] DisplayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];DISPLAYCONFIG_MODE_INFO[] DisplayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,ref pathCount, DisplayPaths, ref modeCount, DisplayModes, IntPtr.Zero);if (error != ERROR_SUCCESS)throw new Win32Exception(error);for (int i = 0; i < modeCount; i++){var modeInfo = DisplayModes[i];if (modeInfo.infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){var targetName =GetDisplayconfigTargetDeviceName(DisplayModes[i].adapterId, DisplayModes[i].id);var displayPathInfo = DisplayPaths.FirstOrDefault(m =>m.targetInfo.adapterId.LowPart == modeInfo.adapterId.LowPart &&m.targetInfo.adapterId.HighPart == modeInfo.adapterId.HighPart &&m.targetInfo.id == modeInfo.id);var sourceName = GetDisplayconfigSourceDeviceName(displayPathInfo.sourceInfo.adapterId,displayPathInfo.sourceInfo.id);listRet.Add((targetName, sourceName));}}}catch (Exception ex){}return listRet;}

相关辅助方法

  • GetDisplayconfigTargetDeviceName 方法:获取目标设备的详细信息,包括友好名称
  • GetDisplayconfigSourceDeviceName 方法: 获取源设备的详细信息,包括显示设备逻辑名称。
public const int ERROR_SUCCESS = 0;public enum QUERY_DEVICE_CONFIG_FLAGS : uint
{QDC_ALL_PATHS = 0x00000001,QDC_ONLY_ACTIVE_PATHS = 0x00000002,QDC_DATABASE_CURRENT = 0x00000004
}public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
{DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
{DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_ROTATION : uint
{DISPLAYCONFIG_ROTATION_IDENTITY = 1,DISPLAYCONFIG_ROTATION_ROTATE90 = 2,DISPLAYCONFIG_ROTATION_ROTATE180 = 3,DISPLAYCONFIG_ROTATION_ROTATE270 = 4,DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_SCALING : uint
{DISPLAYCONFIG_SCALING_IDENTITY = 1,DISPLAYCONFIG_SCALING_CENTERED = 2,DISPLAYCONFIG_SCALING_STRETCHED = 3,DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,DISPLAYCONFIG_SCALING_CUSTOM = 5,DISPLAYCONFIG_SCALING_PREFERRED = 128,DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_PIXELFORMAT : uint
{DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
}public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
{DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
}public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
{DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
}[StructLayout(LayoutKind.Sequential)]
public struct LUID
{public uint LowPart;public int HighPart;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
{public LUID adapterId;public uint id;public uint modeInfoIdx;public uint statusFlags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_TARGET_INFO
{public LUID adapterId;public uint id;public uint modeInfoIdx;DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;DISPLAYCONFIG_ROTATION rotation;DISPLAYCONFIG_SCALING scaling;DISPLAYCONFIG_RATIONAL refreshRate;DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;public bool targetAvailable;public uint statusFlags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_RATIONAL
{public uint Numerator;public uint Denominator;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_INFO
{public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;public uint flags;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_2DREGION
{public uint cx;public uint cy;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{public ulong pixelRate;public DISPLAYCONFIG_RATIONAL hSyncFreq;public DISPLAYCONFIG_RATIONAL vSyncFreq;public DISPLAYCONFIG_2DREGION activeSize;public DISPLAYCONFIG_2DREGION totalSize;public uint videoStandard;public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_MODE
{public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
}[StructLayout(LayoutKind.Sequential)]
public struct POINTL
{int x;int y;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_SOURCE_MODE
{public uint width;public uint height;public DISPLAYCONFIG_PIXELFORMAT pixelFormat;public POINTL position;
}[StructLayout(LayoutKind.Explicit)]
public struct DISPLAYCONFIG_MODE_INFO_UNION
{[FieldOffset(0)]public DISPLAYCONFIG_TARGET_MODE targetMode;[FieldOffset(0)]public DISPLAYCONFIG_SOURCE_MODE sourceMode;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_MODE_INFO
{public DISPLAYCONFIG_MODE_INFO_TYPE infoType;public uint id;public LUID adapterId;public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{public uint value;
}[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{public DISPLAYCONFIG_DEVICE_INFO_TYPE type;public uint size;public LUID adapterId;public uint id;
}[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{public DISPLAYCONFIG_DEVICE_INFO_HEADER header;public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;public ushort edidManufactureId;public ushort edidProductCodeId;public uint connectorInstance;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]public string monitorFriendlyDeviceName;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]public string monitorDevicePath;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public partial struct DISPLAYCONFIG_SOURCE_DEVICE_NAME
{public DISPLAYCONFIG_DEVICE_INFO_HEADER header;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string viewGdiDeviceName;
}
[DllImport("user32.dll")]
public static extern int GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS Flags,out uint NumPathArrayElements,out uint NumModeInfoArrayElements
);[DllImport("user32.dll")]
public static extern int QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS Flags,ref uint NumPathArrayElements,[Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,ref uint NumModeInfoArrayElements,[Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,IntPtr CurrentTopologyId
);[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName
);
[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName
);
[DllImport("user32", CharSet = CharSet.Auto)]
public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
/// <summary>
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto,Pack=4)]
public struct MONITORINFO
{/// <summary>/// </summary>            public int cbSize;/// <summary>/// </summary>            public ScreenHelper.RECT rcMonitor;/// <summary>/// </summary>            public ScreenHelper.RECT rcWork;/// <summary>/// </summary>            public int dwFlags ;/*[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)] public char[]  szDevice;*/[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public string DeviceName;
}public static DISPLAYCONFIG_TARGET_DEVICE_NAME GetDisplayconfigTargetDeviceName(LUID adapterId, uint targetId)
{DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME();deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_TARGET_DEVICE_NAME));deviceName.header.adapterId = adapterId;deviceName.header.id = targetId;deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;int error = DisplayConfigGetDeviceInfo(ref deviceName);if (error != ERROR_SUCCESS)throw new Win32Exception(error);return deviceName;
}public static DISPLAYCONFIG_SOURCE_DEVICE_NAME GetDisplayconfigSourceDeviceName(LUID adapterId, uint targetId)
{DISPLAYCONFIG_SOURCE_DEVICE_NAME deviceName = new DISPLAYCONFIG_SOURCE_DEVICE_NAME();deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_SOURCE_DEVICE_NAME));deviceName.header.adapterId = adapterId;deviceName.header.id = targetId;deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;int error = DisplayConfigGetDeviceInfo(ref deviceName);if (error != ERROR_SUCCESS)throw new Win32Exception(error);return deviceName;
}

示例代码

以下是 GetMonitorFriendlyName 方法的完整实现:

public static string GetMonitorFriendlyName(bool isPrimary)
{try{var screen = ScreenHelper.GetScreen(isPrimary);var targetDeviceNames = GeTargetDeviceNames();return targetDeviceNames.FirstOrDefault(m => m.Item2.viewGdiDeviceName.EqualsIgnoreCase(screen.DeviceName)).Item1.monitorDevicePath;}catch (Exception ex){return string.Empty;}
}

相关文章:

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时&#xff0c;获取显示器的友好名称&#xff08;Friendly Name&#xff09;是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法&#xff0c;了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…...

2.3 携程的hook实现及dlsym函数

背景知识&#xff1a;&#xff08;排除static 情况&#xff09; 一个进程中可以有相同的命名吗&#xff1f; -- 不能 两个进程之间可以有相同的命名吗&#xff1f;--可以 一个进程和另一个静态库可以有相同的命名吗&#xff1f;--不能 一个进程和另一个动态库之间可以有相同…...

机器学习之KNN算法

K-Nearest Neighbors (KNN) 是一种常见的机器学习算法&#xff0c;广泛应用于分类和回归问题。KNN是一种基于实例的学习方法&#xff0c;它利用训练数据集的实例来进行分类或回归预测。在KNN中&#xff0c;预测的结果依赖于距离度量函数计算出的最近邻实例的标签或值。下面我们…...

《全排列问题》

题目描述 按照字典序输出自然数 11 到 nn 所有不重复的排列&#xff0c;即 nn 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 由 1∼n1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留…...

pycharm 快捷键

PyCharm 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的快捷键来提高开发效率。以下是一些常用的 PyCharm 快捷键&#xff08;基于 Windows/Linux 系统&#xff0c;Mac 系统可能略有不同&#xff09;&#xff1a; 通用快捷键 功能快捷键&a…...

若依微服务如何获取用户登录信息

文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步&#xff1a;后端获取当前用户信息第二步&#xff1a;前端获取当前用户信息 5、运行结果6、总结 1、需求提出 在微服务架构中&#xff0c;获取当前用户的登录信息是开发常见的需求。无论是后端处理业务…...

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…...

TCP三次握手,四次挥手

三次握手 第一次握手&#xff1a;客户端向服务器发送一个 SYN 包&#xff0c;其中 SYN 标志位被设置为 1&#xff0c;表示客户端请求建立连接&#xff0c;并随机生成一个初始序列号 seqx 。此时客户端进入 SYN_SENT 状态&#xff0c;等待服务器的确认1.第二次握手&#xff1a;服…...

Mono里建立调试C#脚本运行环境

前面已经介绍了怎么样来执行一个嵌入式的脚本框架, 这个框架是mono编写的一个简单的例子。 如果不清楚,可以参考前文: https://blog.csdn.net/caimouse/article/details/144632391?spm=1001.2014.3001.5501 本文主要来介绍一下,我们的C#脚本是长得怎么样的,它大体如下…...

Linux dnf 包管理工具使用教程

简介 dnf 是基于 Red Hat Linux 发行版的下一代包管理工具&#xff0c;它代替 yum 提供更好的性能、更好的依赖处理和更好的模块化架构。 基础语法 dnf [options] [command] [package] 常用命令用法 更新元数据缓存 sudo dnf check-update# 检查已安装的包是否有可用的更…...

Java 创建线程的方式有哪几种

在 Java 中&#xff0c;创建线程的方式有四种&#xff0c;分别是&#xff1a;继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future、使用线程池。以下是详细的解释和通俗的举例&#xff1a; 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法来创建线程。 步…...

计算机的错误计算(一百八十七)

摘要 用大模型计算 sin(123.456789). 其自变量为弧度。结果保留16位有效数字。第一个大模型是数学大模型。先是只分析&#xff0c;不计算&#xff1b;后经提醒&#xff0c;才给出结果&#xff0c;但是是错误结果。第二个大模型&#xff0c;直接给出了Python代码与结果&#xf…...

12. 最大括号深度

题目描述 现有一字符串仅由"("&#xff0c;")", "{","}", "[", "]"六种括号组成。若字符串满足以下条件之一&#xff0c; 则为无效字符串:任一类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号输出…...

进程与线程以及如何查看

长期补充&#xff0c;建议关注收藏&#xff01; 定义 特性进程线程定义程序执行的基本单位执行中的最小单位资源拥有独立的内存空间和资源共享进程的资源开销创建和销毁的开销较大创建和销毁的开销较小执行单位进程中可以有多个线程线程是执行单元&#xff0c;必须依赖于进程并…...

BlueLM:以2.6万亿token铸就7B参数超大规模语言模型

一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型&#xff0c;同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 &#xff1a;高质量语料…...

Webpack学习笔记(4)

1.缓存 可以通过命中缓存降低网络流量&#xff0c;是网站加站速度更快。 然而在部署新版本时&#xff0c;不更改资源的文件名&#xff0c;浏览器可能认为你没有更新&#xff0c;所以会使用缓存版本。 由于缓存存在&#xff0c;获取新的代码成为问题。 接下来将配置webpack使…...

28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强

A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法&#xff1a;无模型水下图像增强方法&#xff1a;基于深度学习的水下图像增强方法&#xff1a; 论文方法概述像素分布…...

5.interview-self-introduction

1.保证电话面试来的时候&#xff0c;可以接听&#xff0c;保持电话通常 interviews will be arranged recently.please keep your phone line open and make sure you can answer th call when the phone interview comes. speak loudly and slow down your speaking voice &a…...

高性能MySQL-查询性能优化

查询性能优化 1、为什么查询这么慢2、慢查询基础&#xff1a;优化数据访问2.1 是否向数据库请求了不需要的数据2.2 MySQL是否存在扫描额外的记录 3、重构查询方式3.1 一个复杂查询还是多个简单查询3.2 切分查询3.3 分解联接查询 4、查询执行的基础4.1 MySQL的客户端/服务器通信…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...