三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

OpenCV中可以通过ImRead方法读取照片,通过ImShow方法显示照片;但是无法在PictureBox控件中显示
PictureBox控件只能展示BitmapImage数据类型图片

为此查阅了网上很多篇博文,将三种数据类型之间的转换进行了归纳整理,感谢网上大佬们的博文分享,参考的内容过多就不再一一感谢了哈。

本篇博文以展示图片的效果进行演示,Mat数据类型通过OpenCV展示Bitmap数据类型和Image数据类型通过pictureBox控件进行展示

零、前期准备工作

1,页面布局

注意button的序号哈
在这里插入图片描述

2,命名空间

引入OpenCvSharp命名空间

using OpenCvSharp;
using OpenCvSharp.Extensions;

在这里插入图片描述
在这里插入图片描述
这仨必须有哈,没有的话就从旁边的浏览里面搜索下载

3,照片准备

为了更好的演示效果,每个功能对应的照片都进行了设计,一共九张
例如:
Bitmap.png,表示将来读入的是Bitmap数据类型,将来展示的也是Bitmap数据类型形式在控件中显示
Mat2Image.png,表示将来读入的是Mat数据类型,转换为Image数据类型之后在控件中显示
Bitmap2Mat.png,表示将来读入的是Bitmap数据类型,转换为Mat数据类型之后通过ImShow方法进行显示
Mat.png,表示通过ImRead方法读入Mat数据类型图片,之后通过ImShow方法进行显示
以此类推哈

在这里插入图片描述

3,图片路径对应说明

string SelfMat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat.png";
string Mat2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Bitmap.png";
string Mat2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Image.png";string SelfBitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap.png";
string Bitmap2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Mat.png";
string Bitmap2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Image.png";string SelfImage = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image.png";
string Image2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Mat.png";
string Image2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Bitmap.png";

SelfMat 这样的代表将来读入的是Mat数据类型
Bitmap2Mat 这样的代表将来读入的是Bitmap数据类型,转换为Mat数据类型之后通过ImShow方法进行显示
Mat2Image这样的代表将来通过ImRead方法读入Mat数据类型,转换为Image数据类型之后显示到控件中
以此类推

一、Mat数据类型

通过OpenCV的ImRead方法读取的都是Mat数据类型
通过ImShow方法进行显示照片即可

Mat mat = new Mat();new一个Mat对象,起名为mat
mat = Cv2.ImRead(SelfMat,ImreadModes.Color);读取SelfMat图片,显示三通道彩色图片ImreadModes.Color,此时mat为Mat数据类型的图片
Cv2.NamedWindow("Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Mat", mat);显示Mat窗口,显示的内容为Mat数据类型对象mat
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Mat");摧毁Mat窗口

private void button1_Click(object sender, EventArgs e)
{Mat mat = new Mat();mat = Cv2.ImRead(SelfMat,ImreadModes.Color);Cv2.NamedWindow("Mat", WindowFlags.Normal);Cv2.ImShow("Mat", mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Mat");
}

二、Bitmap数据类型

Bitmap数据类型和Image可以直接在控件中进行展示,将图片赋值给控件的Image属性即可

Bitmap bitmap = new Bitmap(SelfBitmap);以Bitmap数据类型读取SelfBitmap照片,此时bitmap为Bitmap数据类型的图片
pictureBox1.Image = bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap显示到控件中

private void button2_Click(object sender, EventArgs e)
{Bitmap bitmap = new Bitmap(SelfBitmap);pictureBox1.Image = bitmap;
}

三、Image数据类型

这里需要通过FromFile方法读入图片

Image image = Image.FromFile(SelfImage);以Image数据类型读取SelfImage照片,此时image为Image数据类型的图片
pictureBox1.Image = image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image显示到控件中

private void button3_Click(object sender, EventArgs e)
{Image image = Image.FromFile(SelfImage);pictureBox1.Image = image;
}

四、Mat数据类型转Bitmap数据类型

Mat数据类型可通过ToBitmap方法转换为Bitmap数据类型

Mat mat_mat2bitmap = new Mat();创建Mat数据类型对象mat_mat2bitmap
mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);读取Mat2Bitmap图片,显示三通道彩色图片ImreadModes.Color,此时mat_mat2bitmap为Mat数据类型的图片
Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();通过ToBitmap方法,将Mat数据类型对象mat_mat2bitmap转换为Bitmap数据类型对象bitmap_mat2bitmap
pictureBox1.Image = bitmap_mat2bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap_mat2bitmap显示到控件中

 private void button4_Click(object sender, EventArgs e){Mat mat_mat2bitmap = new Mat();mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();pictureBox1.Image = bitmap_mat2bitmap;}

五、Mat数据类型转Image数据类型

Mat数据类型转Image数据类型我没找到直接转换的方法
使用的方法是:Mat转Bitmap再转Image

Mat mat_mat2image = new Mat();new一个Mat对象,起名为mat_mat2image
mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);读取Mat2Image图片,显示三通道彩色图片ImreadModes.Color,此时mat_mat2image为Mat数据类型的图片
Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();通过ToBitmap方法,将Mat数据类型对象mat_mat2image转换为Bitmap数据类型对象bitmap_mat2image
Image image_mat2image = (Image)bitmap_mat2image;直接强转,将Bitmap数据类型对象bitmap_mat2image转换为Image数据类型对象image_mat2image
pictureBox1.Image = image_mat2image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image_mat2image显示到控件中

private void button5_Click(object sender, EventArgs e)
{Mat mat_mat2image = new Mat();mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();Image image_mat2image = (Image)bitmap_mat2image;pictureBox1.Image = image_mat2image;
}

六、Bitmap数据类型转Mat数据类型

Bitmap数据类型可通过ToMat方法转换为Mat数据类型

Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);以Bitmap数据类型读取Bitmap2Mat照片
Mat mat_bitmap2map = new Mat();new一个Mat对象,起名为mat_bitmap2map,此时mat_bitmap2map为Mat数据类型的图片
mat_bitmap2map = bitmap_bitmap2mat.ToMat();通过ToMat方法,将Bitmap数据类型对象bitmap_bitmap2mat转换为Mat数据类型对象mat_bitmap2map
Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Bitmap2Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);显示Bitmap2Mat窗口,显示的内容为Mat数据类型对象mat_bitmap2map
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Bitmap2Mat");摧毁Bitmap2Mat窗口

private void button6_Click(object sender, EventArgs e)
{Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);Mat mat_bitmap2map = new Mat();mat_bitmap2map = bitmap_bitmap2mat.ToMat();Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);Cv2.WaitKey(0);Cv2.DestroyWindow("Bitmap2Mat");
}

七、Bitmap数据类型转Image数据类型

Bitmap数据类型和Image数据类型可以直接强转,并且都可以在pictureBox控件中显示

Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);以Bitmap数据类型读取Bitmap2Image照片,此时bitmap_bitmap2image为Bitmap数据类型的图片
Image image_bitmap2image = (Image)bitmap_bitmap2image;直接强转,将Bitmap数据类型对象bitmap_bitmap2image转换为Image数据类型对象image_bitmap2image
pictureBox1.Image = image_bitmap2image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image_bitmap2image显示到控件中

private void button7_Click(object sender, EventArgs e)
{Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);Image image_bitmap2image = (Image)bitmap_bitmap2image;pictureBox1.Image = image_bitmap2image;
}

八、Image数据类型转Mat数据类型

Mat数据类型转Image数据类型我也没找到直接转换的方法
使用的方法是:Image转Bitmap再转Mat
Image image_image2mat = Image.FromFile(Image2Mat);通过FromFile方法以Image数据类型读取Image2Mat照片,此时image_image2mat为Image数据类型的图片
Bitmap bitmap_image2mat = (Bitmap)image_image2mat;直接强转,将Image数据类型对象image_image2mat转换为Bitmap数据类型对象bitmap_image2mat
Mat mat_image2mat = new Mat();new一个Mat对象,起名为mat_image2mat
mat_image2mat = bitmap_image2mat.ToMat();通过ToMat方法,将Bitmap数据类型对象bitmap_image2mat转换为Mat数据类型对象mat_image2mat
Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Image2Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Image2Mat", mat_image2mat);显示Image2Mat窗口,显示的内容为Mat数据类型对象mat_image2mat
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Image2Mat");摧毁Image2Mat窗口

private void button8_Click(object sender, EventArgs e)
{Image image_image2mat = Image.FromFile(Image2Mat);Bitmap bitmap_image2mat = (Bitmap)image_image2mat;Mat mat_image2mat = new Mat();mat_image2mat = bitmap_image2mat.ToMat();Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);Cv2.ImShow("Image2Mat", mat_image2mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Image2Mat");
}

九、Image数据类型转Bitmap数据类型

Image数据类型和Bitmap数据类型可以直接强转,并且都可以在pictureBox控件中显示

Image image_image2bitmap = Image.FromFile(Image2Bitmap);通过FromFile方法以Image数据类型读取Image2Bitmap照片,此时image_image2bitmap为Image数据类型的图片
Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;直接强转,将Image数据类型对象image_image2bitmap转换为Bitmap数据类型对象bitmap_image2bitmap
pictureBox1.Image = bitmap_image2bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap_image2bitmap显示到控件中

private void button9_Click(object sender, EventArgs e)
{Image image_image2bitmap = Image.FromFile(Image2Bitmap);Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;pictureBox1.Image = bitmap_image2bitmap;
}

十、完整项目代码

项目名称:Mat_Bitmap_Image

using System;
using System.Drawing;
using System.Windows.Forms;using OpenCvSharp;
using OpenCvSharp.Extensions;namespace Mat_Bitmap_Image
{public partial class Form1 : Form{string SelfMat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat.png";string Mat2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Bitmap.png";string Mat2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Image.png";string SelfBitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap.png";string Bitmap2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Mat.png";string Bitmap2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Image.png";string SelfImage = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image.png";string Image2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Mat.png";string Image2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Bitmap.png";public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}/// <summary>/// Mat数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){Mat mat = new Mat();mat = Cv2.ImRead(SelfMat,ImreadModes.Color);Cv2.NamedWindow("Mat", WindowFlags.Normal);Cv2.ImShow("Mat", mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Mat");}/// <summary>/// Bitmap数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){Bitmap bitmap = new Bitmap(SelfBitmap);pictureBox1.Image = bitmap;}/// <summary>/// Image数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){Image image = Image.FromFile(SelfImage);pictureBox1.Image = image;}/// <summary>/// Mat数据类型转换为Bitmap数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){Mat mat_mat2bitmap = new Mat();mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();pictureBox1.Image = bitmap_mat2bitmap;}/// <summary>/// Mat数据类型转换为Image数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){Mat mat_mat2image = new Mat();mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();Image image_mat2image = (Image)bitmap_mat2image;pictureBox1.Image = image_mat2image;}/// <summary>/// Bitmap数据类型转化为Mat数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button6_Click(object sender, EventArgs e){Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);Mat mat_bitmap2map = new Mat();mat_bitmap2map = bitmap_bitmap2mat.ToMat();Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);Cv2.WaitKey(0);Cv2.DestroyWindow("Bitmap2Mat");}/// <summary>/// Bitmap数据类型转换为Image数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button7_Click(object sender, EventArgs e){Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);Image image_bitmap2image = (Image)bitmap_bitmap2image;pictureBox1.Image = image_bitmap2image;}/// <summary>/// Image数据类型转换为Mat数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button8_Click(object sender, EventArgs e){Image image_image2mat = Image.FromFile(Image2Mat);Bitmap bitmap_image2mat = (Bitmap)image_image2mat;Mat mat_image2mat = new Mat();mat_image2mat = bitmap_image2mat.ToMat();Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);Cv2.ImShow("Image2Mat", mat_image2mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Image2Mat");}/// <summary>/// Image数据类型转化为Bitmap数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button9_Click(object sender, EventArgs e){Image image_image2bitmap = Image.FromFile(Image2Bitmap);Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;pictureBox1.Image = bitmap_image2bitmap;}}
}

十一、效果展示

0,主界面

在这里插入图片描述

1,Mat数据类型

在这里插入图片描述

2,Bitmap数据类型

在这里插入图片描述

3,Image数据类型

在这里插入图片描述

4,Mat转Bitmap数据类型

在这里插入图片描述

5,Mat转Image

在这里插入图片描述

6,Bitmap转Mat

在这里插入图片描述

7,Bitmap转Image

在这里插入图片描述

8,Image转Mat

在这里插入图片描述

9,Image转Bitmap

在这里插入图片描述

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

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

相关文章

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

【mT5多语言翻译】之一——实战项目总览

[1] 总览 【mT5多语言翻译】系列共六篇文章&#xff1a; 【mT5多语言翻译】之一——实战项目总览   【mT5多语言翻译】之二——模型&#xff1a;T5模型与mT5模型与前置知识   【mT5多语言翻译】之三——数据集&#xff1a;多语言翻译数据集与预处理   【mT5多语言翻译】之…

cesium 添加动态波纹效果 圆形扩散效果 波纹材质

一、扩展材质 /*** 水波纹扩散材质* param {*} options* param {String} options.color 颜色* param {Number} options.duration 持续时间 毫秒* param {Number} options.count 波浪数量* param {Number} options.gradient 渐变曲率*/function CircleWaveMaterialProperty(opt…

代码随想录--数组--移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度…

Win11 使用 WSL2 安装 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu 段子手168 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 启用适用于 Linux 的 Windo…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…

python 有哪些函数

Python内置的函数及其用法。为了方便记忆&#xff0c;已经有很多开发者将这些内置函数进行了如下分类&#xff1a; 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) …

STM32H7通用定时器计数功能的使用

目录 概述 1 STM32定时器介绍 1.1 认识通用定时器 1.2 通用定时器的特征 1.3 递增计数模式 1.4 时钟选择 2 STM32Cube配置定时器时钟 2.1 配置定时器参数 2.2 配置定时器时钟 3 STM32H7定时器使用 3.1 认识定时器的数据结构 3.2 计数功能实现 4 测试案例 4.1 代码…

3D Matching:实现halcon中的find_surface_model

halcon中的三维匹配大致分为两类&#xff0c;一类是基于形状的(Shape-Based)&#xff0c;一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体&#xff0c;3D物体模型必须是CAD模型&#xff0c;且几何边缘清晰可见&#xff0c;使用的相机也要预…

废品回收 小程序+APP

用户实名认证、回收员实名认证、后台审核、会员管理、回收员管理、订单管理、提现管理、地图、档案管理。 支持&#xff0c;安卓APP、苹果APP、小程序 流程&#xff1a; 一、用户端下单&#xff0c;地图选择上门位置、填写具体位置、废品名称、预估重量、选择是企业废旧、家…

嵌入式ARM版本银河麒麟操作系统V10SP1安装OPenGauss数据库

前言&#xff1a; 官网提供了非常完整的openGauss安装步骤。 https://opengauss.org/zh/download/archive/列举一下个人的使用环境&#xff1a; 麒麟V10 rk3588工控板&#xff08;ARM&#xff09; openGauss-3.0.5&#xff08;极简版&#xff09;浏览一下官网&#xff0c;可以…

14款DevOps/SRE工具,助力提升运维效率

简介 随着平台工程的兴起&#xff0c;DevOps 和 SRE 不断发展&#xff0c;带来了新一代工具&#xff0c;旨在提高软件开发和运维的效率、可扩展性和可靠性。 在本篇文章中&#xff0c;我们将深入探讨一些最具发展前景的工具&#xff0c;它们正在塑造持续集成与部署、监控与可观…

特征融合篇 | YOLOv8改进之将Neck网络更换为多级特征融合金字塔HS-FPN | 助力小目标检测

前言:Hello大家好,我是小哥谈。HS-FPN(Hierarchical Scale Feature Pyramid Network)是一种用于目标检测任务的网络结构。它是在传统的Feature Pyramid Network(FPN)基础上进行改进的。HS-FPN的主要目标是解决目标检测中存在的多尺度问题。在传统的FPN中,通过在不同层级…

【网站项目】校园失物招领小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

上线数日暴涨600%市值直逼节点猴,Runestone符石为何成第二大比特币NFT?

NodeMonkes&#xff08;节点猴&#xff09;市值超越BAYC成为第二大NFT之际&#xff0c;凭借着不断上涨的市场热度和人气&#xff0c;符文项目Runestone在空投数日后也成功跻身为比特币生态市值第二大NFT。Runestone高共识背后的动因有哪些&#xff1f;又有哪些策略具有借鉴意义…

Qt 多窗体

前言 在 Qt编程中经常会遇到要在多个界面之间切换的情况&#xff0c;如从登录界面跳转到主界面&#xff0c;从主界面跳转到设置界面&#xff0c;再返回到主界面。我们将会用一个简单的示例来实现多窗体功能。 登录窗口 创建基类为QMainWindow&#xff0c;类名为LoginWin。再使用…

新零售SaaS架构:客户管理系统架构设计(万字图文总结)

什么是客户管理系统&#xff1f; 客户管理系统&#xff0c;也称为CRM&#xff08;Customer Relationship Management&#xff09;&#xff0c;主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理&#xff0c;吸引和留存客户&#xff0c;实现缩短销售周…

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法只需一条SQL。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

Tomcat 获取客户端真实IP X-Forwarded-For

Tomcat 获取客户端真实IP X-Forwarded-For 代码实现&#xff1a; 在Host标签下面添加代码&#xff1a; <Valve className"org.apache.catalina.valves.RemoteIpValve" remoteIpHeader"x-forwarded-for" remoteIpProxiesHeader"x-forwarded-by&q…

【Android】【root remount】【3】remount 文件详细信息获取

前言 我们在root & remount 设备后&#xff0c;push相关文件到systm 、vendor、product 等目录进行调试&#xff0c;那么我们push的文件被保存在什么地方呢&#xff1f; 以及我们FWS、app侧如何过去push 的文件信息呢&#xff1f; remount push 文件保存 push 文件保存的…