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 无法从缓冲区加载图像的主要内容,如果未能解决你的问题,请参考以下文章

Qt OpenGL帧缓冲区到图像

用于视频处理的图像缓冲区 [关闭]

GraphicsScene 中的 Qt GLWidget 用于从图像数据(C++、Windows)中快速显示视频?

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

如何在 Qt 中使用顶点缓冲区对象渲染地形?

在 qt for symbian 中查看图像