将原始位图转换为QT中的png

raw bitmap to png in QT

本文关键字:QT 中的 png 转换 原始 位图      更新时间:2023-10-16

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

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

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

如果不是这样,另一个选项是将png标头添加到位图数组中。然而,我不知道该怎么做。

有人有什么想法吗?

我似乎应该使用构造函数来提及使用的bytesPerLine。

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

提到了每行字节数,现在一切都很好。

在这两行中有几个问题:

  • 根据官方文档,未指定启动器的保存格式:。

    Q图像;QByteArray ba;QBuffer缓冲区(&ba);buffer.open(QIODevice::WriteOnly);image.save(&buffer,"PNG");//以PNG格式将图像写入ba

  • 未指定加载的格式。

  • 您正在C++代码中执行C类型转换

  • 您正在进行不必要的强制转换,因为存在QByteArray过载。

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

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

    Q图像;QByteArray ba;QBuffer缓冲区(&ba);buffer.open(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";

当然,您还需要确保图像的宽度和高度是正确的,因为否则,原始数据只是顺序的,类实例无法真正神奇地计算出来。