2

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

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

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

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

请问有人有什么想法吗?

4

2 回答 2

1

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

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

现在提到每行字节,一切正常。

于 2014-01-11T15:13:03.553 回答
1

您在这两行中有几个问题:

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

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

  • 未指定加载格式。

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

  • 由于存在 QByteArray 重载,因此您正在不必要地进行强制转换。

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

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

    QImage图像;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";

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

于 2014-01-11T12:25:54.470 回答