我有一个QByteArray,我想用Qt保存在 JSON文件中,并且能够再次读取它.由于JSON原生无法存储原始数据,我认为最好的方法可能是字符串?目标是以这种方式保存Qpixmap:
{
  "format" : "jpg","data" : "...jibberish..."
}

我如何实现这一点以及如何再次从这个JSON对象中读取(我使用的是Qt5)?我现在拥有的是这样的:

Qpixmap p;
...

QByteArray ba;
QBuffer buffer(&ba);

buffer.open(qiodevice::writeonly);
p.save(&buffer,"jpg");

QJsonObject json;
gameObject["data"] = QString(buffer.data());

QJsonDocument doc(json);
file.write(doc.toJson());

但由此产生的“乱码”是缩短包含整个图像的方法.

解决方法

无法从任意QByteArray构造QString.您需要对字节数组进行编码,使其可以首先转换为字符串.从C语义的角度来看,QString可以从QByteArray构造出来,这有点误导.它是否真的可构建取决于QByteArray中的内容.

QByteArray :: toBase64和fromBase64是这样做的一种方式.

由于您希望保存像素图而不会丢失其内容,因此不应将其保存为有损格式,如JPG.请改用PNG.如果您在执行完整的json-> pixmap-> json电路时没有重复加载和存储相同的像素图,则仅使用JPG.

还有另一个问题:对于要存储或加载自身的pixmap,它需要在内部转换为/从QImage转换.这涉及潜在的颜色格式转换.此类转换可能会丢失数据.您必须小心确保以相同的格式进行任何往返.

理想情况下,您应该使用QImage而不是Qpixmap.在现代的Qt中,无论如何,Qpixmap只是QImage的一个薄包装器.

// https://github.com/KubaO/stackoverflown/tree/master/questions/pixmap-to-json-32376119
#include <QtGui>

QJsonValue jsonValFrompixmap(const Qpixmap &p) {
  QBuffer buffer;
  buffer.open(qiodevice::writeonly);
  p.save(&buffer,"PNG");
  auto const encoded = buffer.data().toBase64();
  return {Qlatin1String(encoded)};
}

Qpixmap pixmapFrom(const QJsonValue &val) {
  auto const encoded = val.toString().tolatin1();
  Qpixmap p;
  p.loadFromData(QByteArray::fromBase64(encoded),"PNG");
  return p;
}

int main(int argc,char **argv) {
   QGuiApplication app{argc,argv};
   QImage img{32,32,QImage::Format_RGB32};
   img.fill(Qt::red);
   auto pix = Qpixmap::fromImage(img);
   auto val = jsonValFrompixmap(pix);
   auto pix2 = pixmapFrom(val);
   auto img2 = pix2.toImage();
   Q_ASSERT(img == img2);
}

如何通过QByteArray在JSON中存储QPixmap?的更多相关文章

  1. Qt工具类

    "Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。通常,相对于函数QString::sprintf(),函数QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变"%n"参数的顺序。QByteArray类具有一个字节数组,它既可以存储原始字节,也可以存储传统的以“\0”结尾的8位的字符串。在Qt中,使用QByteArray比使用constchar*更方便,且QByteArray也支持隐式共享

  2. 正则匹配内容是否含有除汉字数字英文以外的字符

    =null){qString=qString.trim();Stringregex="^[a-zA-Z0-9\u4E00-\u9FA5]+$";Patternpattern=Pattern.compile(regex);Matchermatch=pattern.matcher(qString);booleanb=match.matches();if(b){System.out.println(">>>1");returnfalse;}else{System.out.println(">>>2");retu

  3. 检测特殊字符的正则

    |@|◎|#|#|(\\$)|¥|%|%|(\\^)|……

  4. Windows控制台和Qt Unicode文本

    我花了一整天的时间,试图找出这个没有运气.我看到无处不在,但没有运气与工作代码.操作系统:WinXPSp2IDE&框架:C,QtCreator2.0.我试图将一些unicode文本输出到Windows控制台,但是我看到的都是乱码代替unicode字符.我知道win控制台支持unicode…

  5. Qt的字符串解析

    QString中使用字符串时,解析时有“/“等符号时,当成是正则表达式来处理,如果有""等标签时,当成是Htm标签处理,而且正则表达式的优先级要较Html高。例如:intcolor=0xFF0000;abc="QString+QString::number+QString(">")+QString+QString;QToolTip::showtext;字符串abc中的“HelloWorld!”显示为红色,被当作是Html来解析,如果在字符串中加入了"\n”则不能当前html来解析例如:abc=QStrin

  6. Qt中使用正则表达式返回匹配的所有结果集

    Python的正则中有findAll函数返回一个所有匹配的结果list.今天在使用Qt的时候发现似乎没有类似的方法.进而自己写了一个,代码如下可以这么使用

  7. c – 如何用空格填充QString?

    QString如何用空格贴在最后?

  8. c – QString :: number()’f’格式,不带零尾

    我想将数字转换为QString,有3位数字.做这项工作,但仍然是尾随零.如何使用它没有他们.我也尝试过g,而不应该保留这些零:但例如472.76被转换为473.令我惊讶的是.为什么使用’g’选项?但是我对’f’格式感兴趣.所以主要的问题是如何使用’f’而不使用尾随零?输入–>所需输出472.76–>472.760.0766861–>0.077180.00001–>180解决方法我几乎很尴尬发布,但它的作品:如果你真的关心使用这种方法的性能,你可能想要一个不同的解决方案.

  9. c – 在Qt中从QByteArray加载QPixmap?

    我有一个包含图像内容的字节数组.如何将其加载到Qpixmap中?解决方法这里的格式是字符串文字,如“PNG”或类似的东西

  10. c – 如何将std :: vector转换为QByteArray?

    我试图从std::vector创建QByteArray.我试过;但是它给出了错误;解决方法你需要转换buf.data()而不是buf:

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部