如何通过QByteArray在JSON中存储QPixmap?

如何通过QByteArray在JSON中存储QPixmap?,json,qt,bytearray,qt5,Json,Qt,Bytearray,Qt5,我有一个QByteArray,我想用Qt将它保存在一个JSON文件中,并且能够再次读取它。由于JSON本身无法存储原始数据,我认为最好的方法可能是字符串?目标是通过以下方式保存QPixmap: { "format" : "jpg", "data" : "...jibberish..." } QPixmap p; ... QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); p.save(

我有一个
QByteArray
,我想用Qt将它保存在一个JSON文件中,并且能够再次读取它。由于JSON本身无法存储原始数据,我认为最好的方法可能是字符串?目标是通过以下方式保存QPixmap:

{
  "format" : "jpg",
  "data" : "...jibberish..."
}
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());
如何实现这一点,如何再次读取这个JSON对象(我使用的是Qt5)?我现在看到的是这样的:

{
  "format" : "jpg",
  "data" : "...jibberish..."
}
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());

但由此产生的“jibberish”是包含整个图像的一种简短方式。

A
QString
不能从任意的
QByteArray
构造。首先需要对字节数组进行编码,使其可转换为字符串。有点误导,从C++代码的观点来看,<代码> QStult是从<代码> QByteArray < /C> >中构造的。它是否真正可构造取决于
QByteArray
中的内容

QByteArray::toBase64
fromsbase64
是一种方法

由于您希望保存pixmap而不丢失其内容,因此不应将其保存为类似JPG的有损格式。改用PNG。只有在执行完整的json->pixmap->json循环时没有重复加载和存储相同的pixmap时,才使用JPG

还有另一个问题:对于要存储或加载自身的pixmap,它需要在内部转换为/from
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);
}
//https://github.com/KubaO/stackoverflown/tree/master/questions/pixmap-to-json-32376119
#包括
QJsonValue jsonValFromPixmap(常量QPixmap&p){
缓冲区;
打开(QIODevice::WriteOnly);
p、 保存(&buffer,“PNG”);
auto const encoded=buffer.data().toBase64();
返回{QLatin1String(encoded)};
}
QPixmap pixmapFrom(常量QJsonValue和val){
auto const encoded=val.toString().toLatin1();
qpixp;
p、 loadFromData(QByteArray::fromBase64(编码),“PNG”);
返回p;
}
int main(int argc,字符**argv){
qgui应用程序app{argc,argv};
QImage img{32,32,QImage::Format_RGB32};
充气(Qt::红色);
自动pix=QPixmap::fromImage(img);
auto val=jsonValFromPixmap(pix);
自动pix2=pixmapFrom(val);
auto img2=pix2.toImage();
Q_断言(img==img2);
}

如何将非图像QByteArray放入json?若我这样做(就像你们做的一样),那个么应用程序就会崩溃。有什么想法吗?@Bobur我展示的代码已经过测试,可以使用了。如果你还有其他问题,请以我的回答风格写一个简单的例子,并在你的新问题中发表。每个人的应用程序都在崩溃,每个人都有自己的崩溃方式。我可以想出10或20个不同的事情,你可能做错了,但这不会帮助任何人-猜测是不必要的。你有失败的代码:利用它来帮助你自己。当询问代码时,您绝对必须显示代码,理想情况下显示可以立即编译的代码。