C++ 原始位图到QT中的png

C++ 原始位图到QT中的png,c++,qt,qtgui,qimage,qbytearray,C++,Qt,Qtgui,Qimage,Qbytearray,我有一个字节数组,每三个字节描述一个像素(RGB)。任务是将其转换为jpeg或png。我从socket接收图像调色板,从我拥有的RGB表中构造其相关RGB24 我的问题是现在无法将此位图转换为png。例如: image.loadFromData((const char*)bytes); qDebug() << image.save("/home/saman/image.png"); image.loadFromData((const char*)字节); qDebug()在这两行中

我有一个字节数组,每三个字节描述一个像素(RGB)。任务是将其转换为jpeg或png。我从socket接收图像调色板,从我拥有的RGB表中构造其相关RGB24

我的问题是现在无法将此位图转换为png。例如:

image.loadFromData((const char*)bytes);
qDebug() << image.save("/home/saman/image.png");
image.loadFromData((const char*)字节);

qDebug()在这两行中有几个问题:

  • 未根据指定启动器的保存格式

    图像; QByteArray ba; QBuffer&ba; 打开(QIODevice::WriteOnly); image.save(&buffer,“PNG”);//将图像以PNG格式写入ba

  • 未指定加载的格式

  • > p>你正在用C++代码做C类型的转换。

  • 由于QByteArray过载,您正在进行不必要的强制转换

  • 您正在强制转换为char*,而该特定重载的期望值是unsigned char*

  • 不检查加载操作的返回值

    图像; QByteArray ba; QBuffer&ba; 打开(QIODevice::WriteOnly); image.save(&buffer,“PNG”);//将图像以PNG格式写入ba

所以,我会在你的案例中写下这样的话:

if (!image.loadFromData((const char*)bytes, QImage::Format_RGB888))
    qDebug() << "Could not load the image";

if (!image.save("/home/saman/image.png"), "PNG"))
    qDebug() << "Could not save the image";
if(!image.loadFromData((const char*)字节,QImage::Format_RGB888))

qDebug()似乎我应该使用构造函数来提到使用的bytesPerLine

  QImage *image =new QImage((const uchar*)bytes.constData(),600, 800,1800,QImage::Format_RGB888);

现在每行有字节数,一切正常。

如果在名称后提到图像扩展名,它将自动识别其格式。错误。。。不,不总是。再读一遍:“将尝试猜测”。好的,这次我将尝试格式化。顺便问一下,你说的png图像格式插件是什么意思?QT已经安装了libpng,所以我不需要在我的linux机器上安装它,这是不对的。由于图像是没有标题的位图,QT内部构建的libpng将触发错误。它不依赖于提及格式类型。一年后是否仍无法解决?上面的代码在我的情况下没有任何用处。只有最后两行。它返回false。我已经试过最后两行了。你还试过什么?你忘了交流?无论如何,你会投票决定关闭它,直到你能提供一个可复制的例子。我指的是你的代码。上半部分是将图像以PNG格式写入ba。我们不需要那个。我们需要的是loadFromData()和save()。使用上述格式保存图像也会返回false。顺便问一下,是什么让你如此确信PNG标题会自动添加到pixmap中?@user1596226:你没有提供任何例子来重现这个问题。此外,您甚至没有遵循检查load的返回值、在加载时设置正确的格式等建议。。。根据您之前的评论,您以前也没有尝试过PNG。我们能为你做的太多了…有些奇怪,加载返回错误!虽然我确信字节有内容。loadFromData(bytes.constData())=false,为什么?字节已满,现在将其所有内容呈现到屏幕上。