QT 无法从缓冲区加载图像

Posted

技术标签:

【中文标题】QT 无法从缓冲区加载图像【英文标题】:QT failed to load Image from Buffer 【发布时间】:2017-05-16 10:27:39 【问题描述】:

我的工作环境:Qt 5.8 MSVC2015 64bit, QT GraphicsView, Windows 7 64 bit

我正在从缓冲区加载图像(一个恶魔进程将发送一个图像缓冲区),但它无法使用缓冲区创建图像。

QFile file("D:\\2.png");
if (!file.open(QFile::ReadOnly))
    qDebug() << "Error failed to Open file";
QByteArray array = file.readAll();
array = array.toBase64();
QImage tempimage((uchar *)array.data(), 250, 250, QImage::Format_RGBX8888);
if (!tempimage.isNull()) 
      ///I always get this error
    qDebug() << "Error!!! failed to create a image!"; 

知道我在这里缺少什么吗?

【问题讨论】:

也许 array.data() 为空,你能检查一下吗? 你的逻辑陈述是错误的——你说如果它不为空,那就是一个错误。从if (!tempimage.isNull()) 中删除! 你试过32位格式吗? @Steve Lorimer:感谢您的指正。但我的图像加载为模糊图像。 @Tomaz array.data() 不是 NULL 值。 @Florent ,我尝试使用图像 QImage::Format_BGR30。但我仍然感到不安。 【参考方案1】:

你为什么要转换成base64?

等等,你在哪里从 PNG 转换为图像平面?

尝试bool QImage::loadFromData(const QByteArray &amp;data, const char *format = Q_NULLPTR) 使用原始数据加载 PNG 而不是 CTor。

如果您的有线格式不是 PNG(实际上是 base64 编码的原始像素数据),那么您想要从 base64 转换。

【讨论】:

【参考方案2】:

感谢所有建议和帮助。 我使用 loadFromData 和 QByteArray reinterpret_cast 修复了我的错误删除了 base64 转换和加载的缓冲区:

这是一个最终的解决方案:

QFile file("D:\\2.png");
if (!file.open(QFile::ReadOnly))
    qDebug() << "Error failed to Open file";
QByteArray array = file.readAll();

 QImage tempimage;
 //// This very important to cast in below format, QByteArray don't work as arguments.
 tempimage.loadFromData(reinterpret_cast<const uchar *>(array.data()),array.size());
if (tempimage.isNull()) 
    qDebug() << "Error!!! failed to create a image!";

【讨论】:

以上是关于QT 无法从缓冲区加载图像的主要内容,如果未能解决你的问题,请参考以下文章