主页 > 游戏开发  > 

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

[Qt5]QJson数据之间的转换以及QByteArray图像数据压缩
📢博客主页: 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-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 类型,否则会为空。


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

[Qt5]QJson数据之间的转换以及QByteArray图像数据压缩由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“[Qt5]QJson数据之间的转换以及QByteArray图像数据压缩