【问题标题】:raw bitmap to png in QT在QT中将原始位图转换为png
【发布时间】:2014-01-30 11:16:17
【问题描述】:

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

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

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

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

请问有人有什么想法吗?

【问题讨论】:

  • 如果你在名字后面提到图片扩展名,它会自动识别它的格式。
  • 错误...不,并非总是如此。再读一遍:“将尝试猜测”。
  • 好的,这次我用format试试。顺便说一句,您所说的 png imageformat 插件是什么意思? QT 已经安装了 libpng,所以我不需要在我的 linux 机器上安装它
  • 不,这是不对的。由于图像是位图,没有在 QT 内构建的标头 libpng 会触发错误。它不依赖于提及格式类型。
  • 一年后这个问题还没有解决吗??

标签: c++ qt qtgui qimage qbytearray


【解决方案1】:

这两行有几个问题:

  • 未根据official documentation:指定启动器的保存格式。

    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";

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

【讨论】:

  • 上面的代码在我的情况下没有用。只有最后两行。它返回假。我已经尝试了最后两行。
  • 您还尝试了哪些忘记交流的方法?无论如何,您将投票支持关闭它,直到您可以提供可重现的示例。
  • 我的意思是你的代码。上半部分是以PNG格式将图像写入ba。我们不需要那个。我们需要的是 loadFromData() 和 save()。使用提到的格式保存图像也会返回 false。顺便说一句,是什么让您如此确定 PNG 标头会自动添加到像素图中?
  • @user1596226:您没有提供任何示例来重现该问题。此外,您甚至没有遵循诸如检查负载的返回值、在加载时设置正确的格式等建议……您之前也没有按照您之前的评论尝试过 PNG。我们可以为您做很多事情......
  • 有些奇怪,Load 返回 false!虽然我确信字节有内容。 loadFromData(bytes.constData()) = false,为什么?字节已满,现在将其所有内容呈现到屏幕上。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2014-06-14
    • 1970-01-01
    • 2019-11-10
    • 2018-04-28
    • 2017-09-27
    相关资源
    最近更新 更多