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

[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩

  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. JSON数据之间的转换
      • 二. JSON数据的压缩


一. JSON数据之间的转换

在Qt框架中,QJsonObjectQJsonDocumentQJsonArrayQByteArray 是处理JSON数据的核心类。它们之间的转换通常涉及序列化和反序列化过程。以下是如何在这些类之间进行转换的详细指导:

1、QJsonObjectQJsonDocument 的转换

  • QJsonObjectQJsonDocument
    QJsonDocument 可以用来包装一个 QJsonObjectQJsonArray,以便将其序列化为JSON格式的字符串或字节数组。
QJsonObject jsonObj;
// 填充 jsonObj ...
QJsonDocument jsonDoc(jsonObj);
  • QJsonDocumentQJsonObject
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
    QJsonObject jsonObj = jsonDoc.object();

2、QJsonArrayQJsonDocument 的转换

  • QJsonArrayQJsonDocument
    QJsonObject 类似,QJsonDocument 也可以用来包装一个 QJsonArray
QJsonArray jsonArray;
// 填充 jsonArray ...
QJsonDocument jsonDoc(jsonArray);

// 将QJsonObject添加到QJsonArray数组中
QJsonArray tasksArray
tasksArray.append(QJsonObject);
  • QJsonDocumentQJsonArray
    如果 QJsonDocument 包含的是一个 QJsonArray,你可以通过其 array() 方法来获取它。
QJsonDocument jsonDoc = QJsonDocument::fromJson(someByteArray);
if (!jsonDoc.isNull() && jsonDoc.isArray()) {
    QJsonArray jsonArray = jsonDoc.array();
}

3、QJsonDocument /QJsonObjectQByteArray 的转换

  • QJsonDocumentQByteArray:
    使用 QJsonDocumenttoJson() 方法可以将其序列化为一个 QByteArray
QJsonDocument jsonDoc;
// 填充 jsonDoc ...
QByteArray jsonByteArray = jsonDoc.toJson(QJsonDocument::Compact); // Compact 表示生成紧凑的JSON字符串,减小内存


// 将QJsonObject转换为QByteArray
QJsonObject jsonInfo;
QByteArray algByte = QJsonDocument(jsonInfo).toJson();      // 查看单一模块数据
  • QByteArrayQJsonDocument
    使用 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类型数据,然后使用QtqCompress方法进行压缩,再通过qUncompress解压。

压缩:

int main(){
	//导出任务过大  所以对图像进行裁剪压缩处理-20250222-lw
	HObject 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();
	//对图像进行压缩lw
	QByteArray compressedData = qCompress(ba, 9); // 直接压缩原始数据
	_base64Str = QString::fromLatin1(compressedData.toBase64()); // 将压缩后的数据转换为 Base64 编码的 QString
	int qCompressDataSize = _base64Str.toBase64().size();
}

解压:

void MN_Commontools::deSerializeHImage(const QString& _base64Str, HImage& _img)
{
	QByteArray arr_base64 = _base64Str.toLatin1();
	int uncompressedDataSize = arr_base64.size();
	//20250224 对压缩图像进行解压lw
	QByteArray 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 类型,否则会为空。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

相关文章:

  • ACM-BufferedWriter---格式化输出浮点数
  • ADC采集模块与MCU内置ADC性能对比
  • GitHub开源协议选择指南:如何为你的项目找到最佳“许可证”?
  • 记一次按键中断的bug
  • C++中函数的调用
  • 【论文笔记】Attentive Eraser
  • 利用Java爬虫获取1688店铺所有商品信息:实战指南
  • 探秘基带算法:从原理到5G时代的通信变革【七】FFT/DFT
  • C++11之右值引用
  • Pycharm操作(二)设置字体大小
  • 基于深度学习的网络摄像头图像实时分类实践:从理论到完整实现
  • 集群、分布式与微服务架构 区别
  • 常用 nvm 命令指南
  • 懒加载能够解决Spring循环依赖吗
  • golang lumberjack 日志包
  • 【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面
  • PostgreSQL中的模式(Schema)
  • 基于值函数的强化学习算法之SARSA详解
  • 02 HarmonyOS Next仪表盘案例详解(一):基础篇
  • Python执行脚本并捕获输出
  • 北京与城乡建设委员会网站/sem推广软件选哪家
  • 日韩设计网站/西安seo技术培训班
  • net创建网站之后怎么做/如何制作一个网站
  • 美食林商业供应链管理系统登录/电脑清理优化大师
  • 哈尔滨做网站seo/怎样进行seo
  • 广东省农业农村厅班子/seo点击工具