[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩
- 📢博客主页:https://loewen.blog.csdn.net
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
- 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨
文章预览:
- 一. JSON数据之间的转换
- 二. JSON数据的压缩
一. JSON数据之间的转换
在Qt框架中,QJsonObject
、QJsonDocument
、QJsonArray
和 QByteArray
是处理JSON数据的核心类。它们之间的转换通常涉及序列化和反序列化过程。以下是如何在这些类之间进行转换的详细指导:
1、QJsonObject
与 QJsonDocument
的转换
QJsonObject
转QJsonDocument
:
QJsonDocument
可以用来包装一个QJsonObject
或QJsonArray
,以便将其序列化为JSON
格式的字符串或字节数组。
QJsonObject jsonObj;
// 填充 jsonObj ...
QJsonDocument jsonDoc(jsonObj);
QJsonDocument
转QJsonObject
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isObject()) {QJsonObject jsonObj = jsonDoc.object();
2、QJsonArray
与 QJsonDocument
的转换
QJsonArray
转QJsonDocument
:
与QJsonObject
类似,QJsonDocument
也可以用来包装一个QJsonArray
。
QJsonArray jsonArray;
// 填充 jsonArray ...
QJsonDocument jsonDoc(jsonArray);// 将QJsonObject添加到QJsonArray数组中
QJsonArray tasksArray
tasksArray.append(QJsonObject);
QJsonDocument
转QJsonArray
:
如果 QJsonDocument 包含的是一个 QJsonArray,你可以通过其 array() 方法来获取它。
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isArray()) {QJsonArray jsonArray = jsonDoc.array();
}
3、QJsonDocument
/QJsonObject
与 QByteArray
的转换
QJsonDocument
转QByteArray
:
使用QJsonDocument
的 toJson() 方法可以将其序列化为一个QByteArray
。
QJsonDocument jsonDoc;
// 填充 jsonDoc ...
QByteArray jsonByteArray = jsonDoc.toJson(QJsonDocument::Compact); // Compact 表示生成紧凑的JSON字符串,减小内存// 将QJsonObject转换为QByteArray
QJsonObject jsonInfo;
QByteArray algByte = QJsonDocument(jsonInfo).toJson(); // 查看单一模块数据
- 转
QByteArray
转QJsonDocument
使用 QJsonDocument::fromJson() 静态方法可以从一个QByteArray
中解析出一个QJsonDocument
。
QByteArray jsonByteArray;
// 填充 jsonByteArray ...
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonByteArray);
4、QByteArray
与其他类型的直接转换
QByteArray 通常不与 QJsonObject 或 QJsonArray 直接转换,而是通过与 QJsonDocument 的中介来实现。这是因为 QJsonObject 和 QJsonArray 是表示JSON数据结构的类,而 QByteArray 是表示字节序列的类。
二. JSON数据的压缩
以Halcon图像为例:
思路:将Halcon图像转换成QByteArray
类型数据,然后使用Qt
的qCompress方法进行压缩,再通过qUncompress解压。
压缩:
int main(){//导出任务过大 所以对图像进行裁剪压缩处理-20250222-lwHObject domain, RegionDifference, dilationRegion, modelImage, modelRegion;Difference(m_matchGraphicsData.m_Region.at(MODELCON), m_matchGraphicsData.m_Region.at(MODELEXC), &modelRegion);//膨胀一下,得到一些模板区域以外的图像,避免创建模板留下黑边DilationCircle(modelRegion, &dilationRegion, 30); // 获取图像中模板以外的区域进行绘制GetDomain(m_matchGraphicsData.m_modelImage, &domain);Difference(domain, dilationRegion, &RegionDifference);PaintRegion(RegionDifference, m_matchGraphicsData.m_modelImage, &modelImage, 0, "fill");// 压缩图像数据MN_Commontools::serializeHImage(modelImage, imgStr);// 解压图像数据MN_Commontools::deSerializeHImage(imgStr, modelImage);
}
void MN_Commontools::serializeHImage(const HImage& _img, QString& _base64Str)
{HSerializedItem imgItem;Hlong _imgSize;imgItem = _img.SerializeImage();void* imgBegin = imgItem.GetSerializedItemPtr(&_imgSize);QByteArray ba;QBuffer buf(&ba);buf.setData((char*)imgBegin, _imgSize);int beginDataSize = ba.toBase64().size();//对图像进行压缩lwQByteArray compressedData = qCompress(ba, 9); // 直接压缩原始数据_base64Str = QString::fromLatin1(compressedData.toBase64()); // 将压缩后的数据转换为 Base64 编码的 QStringint qCompressDataSize = _base64Str.toBase64().size();
}
解压:
void MN_Commontools::deSerializeHImage(const QString& _base64Str, HImage& _img)
{QByteArray arr_base64 = _base64Str.toLatin1();int uncompressedDataSize = arr_base64.size();//20250224 对压缩图像进行解压lwQByteArray compressedData = QByteArray::fromBase64(arr_base64); // 将 Base64 编码的 QByteArray 解码为原始的压缩二进制数据QByteArray arr_default = qUncompress(compressedData); // 解压缩数据int uncompressedDataSize1 = arr_default.size();//兼顾未压缩的老任务,解压失败还是直接读取原任务if (arr_default.size() == 0)arr_default = QByteArray::fromBase64(arr_base64);char* charPtr = arr_default.data();int charSize = arr_default.length();HSerializedItem imgItem;try{imgItem.CreateSerializedItemPtr(charPtr, charSize, "true");_img.DeserializeImage(imgItem);}catch (const HException& e){// INFO_VISION("%s,%s", e.ProcName().Text(), e.ErrorMessage().Text());}
}
注意:压缩后的QByteArray图像数据不能转换成QJsonObject 类型,否则会为空。
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |
相关文章:
[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…...
2025年能源工作指导意见
2025年是“十四五”规划收官之年,做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署,以能源高质量发展和高水平安全助力我国经济持续回升向好,满足人民群众日益增长的美好生活用能需求,制定本意见。 一、总体要求…...

Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format
命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题: 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …...

深入探索像ChatGPT这样的大语言模型-02-POST training supervised finetuning
参考 【必看珍藏】2月6日,安德烈卡帕西最新AI普及课:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果,可以参…...

广义线性模型下的数据分析(R语言)
一、实验目的: 通过上机试验,掌握利用R实现线性回归分析、逻辑回归、列联分析及方差分析,并能对分析结果进行解读。 数据: 链接: https://pan.baidu.com/s/1JqZ_KbZJEk-pqSUWKwOFEw 提取码: hxts 二、实验内容: 1、2…...

AutoMQ:无需 Cruise Control 实现 Kafka 的自动分区再平衡
导读:AutoMQ是一款贯彻云优先理念来设计的 Kafka 替代产品。AutoMQ 创新地对 Apache Kafka 的存储层进行了基于云的重新设计,在 100% 兼容 Kafka 的基础上通过将持久性分离至 EBS 和 S3 带来了 10x 的成本降低以及 100x 的弹性能力提升,并且相…...

在剪映中给英文学习视频添加中文字幕
文章目录 一、剪映是什么?二、使用步骤1.下载2.操作 一、剪映是什么? 剪映是由字节跳动公司开发的一款功能强大且易于使用的视频编辑软件,在移动端和电脑端均有应用。 二、使用步骤 1.下载 2.操作...

Opencv之sift特征检测和FLANN 匹配器进行指纹特征匹配
sift特征检测和FLANN 匹配器进行指纹匹配 目录 sift特征检测和FLANN 匹配器进行指纹匹配1 sift特征检测1.1 概念1.2 优缺点 2 FLANN 匹配器2.1 概念2.2 工作原理与匹配方式2.3 FLANN 匹配器的使用步骤2.4 优缺点 3 函数3.1 特征检测匹配3.2 匹配符合条件点并绘制 3 代码测试3.1…...
rust学习~tokio的io
await Suspend execution until the result of a Future is ready. 暂停执行,直到一个 Future 的结果就绪。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 对一个 Future 使用 .awa…...
FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
本地部署大数据集群前置准备
1. 设置VMware网段 虚拟网络编辑器——更改设置——选择VMnet8——子网改成192.168.88.0——NAT设置——网关设置为192.168.88.2 2. 下载CentOS操作系统 下载CentOS 7.6(1810)版本 3. 在VMware中安装CentOS操作系统 创建新的虚拟机——典型——安装光盘映像文件——输入账…...

Spring Boot整合RabbitMQ
1. 环境准备 Spring Boot 2.1.3.RELEASERabbitMQ 3.xJDK 8 或以上Maven 3.5 2. 安装Erlang、RabbitMQ 2.1 安装前准备 RabbitMQ 依赖 Erlang 环境,需确保两者的版本匹配,官方兼容性参考:RabbitMQ & Erlang 版本对照表。 2.2 下载安…...

CDefView::_OnFSNotify函数分析
进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象,变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…...
精准汇报:以明确答复助力高效工作
在工作场景中,汇报工作是一项至关重要的沟通环节,它不仅关乎工作进展的有效传达,更影响着团队协作的顺畅度和整体工作效率。而汇报工作的关键,就在于给予明确肯定的答复,摒弃“应该”“可能”这类模糊词汇,…...

Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例
在 Java 编程体系中,基本数据类型与包装类紧密关联,它们各自有着独特的特性和应用场景。理解两者之间的关系,特别是涉及到拆箱与装箱、实例化顺序、区域问题、缓存问题以及效率问题。 一、为什么基本类型需要包装类 泛型与集合的需求 Java…...
软件工程---基于构件的软件工程
基于构件的软件工程(CBSE)是一种软件开发方法,通过重用现有的软件构件来构建系统,从而提高开发效率和软件质量。这种方法强调软件系统的模块化设计和构建复用,使得软件开发过程更加高效和灵活。 企业软件开发…...
AMD RDNA3 GPU架构解析
本文会通过把AMD的RDNA3架构为例比喻为**“施工公司”**工作模式,深入理解GPU如何高效处理顶点着色、像素计算等任务。 一、施工公司的组织架构 1. 施工公司(WGP)与施工队(CU) WGP(Work Group Processor&…...
docker关闭mysql端口映射的使用
需求 项目中的数据库为mysql,如果将端口映射到宿主机上,容易被工具扫描出,且随着国产化的进程推进,mysql将不被允许。为了提高安全性与满足项目需求,这里采用隐藏mysql端口方式,不映射宿主机端口ÿ…...

关于对机器中的人工智能进行基准测试
大家读完觉得有帮助记得及时关注和点赞!!! 抽象 最近的基准研究声称,AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而,本立场文件认为,当前的 AI 评估范式不足以评估类似人类的认知能力。我…...
CSS - 妙用Sass
官方文档:https://www.sass.hk/docs/ 1.例1: each $theme in $themeList {$themeKey: map-get($theme, key);media screen and (weex-theme: $themeKey) {.btnText {max-width: 150px;include font(map-get($theme, medFont),map-get($theme, subFontS…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...