将 std::vector<uint8_t> 转换为 QImage

Posted

技术标签:

【中文标题】将 std::vector<uint8_t> 转换为 QImage【英文标题】:Convert std::vector<uint8_t> to QImage 【发布时间】:2015-06-29 08:36:31 【问题描述】:

我正在尝试从 std::vector 创建 QImage。我试过;

void FaceCutThread::convertImage(std::vector<uint8_t> &buf)

    QImage img(&buf[0], 300, 300, QImage::Format_ARGB32);

    emit isFinisedFaceCut(img);

void FaceCutThread::convertImage(std::vector<uint8_t> &buf)

    QImage img(buf.data(), 300, 300, QImage::Format_ARGB32);

    emit isFinisedFaceCut(img);

两种类型的转换都没有给出任何错误;但是,当我尝试在QLabel 中显示它时;

void MainWindow::handleFaceResults(QImage& buf)

    QImage myImage(buf);
    ui->lblRawImage->setPixmap(QPixmap::fromImage(myImage));

我的应用程序总是意外完成。能否请您帮助我如何正确转换为 QImage?

编辑:

我可以毫无问题地将图像写入文件;

bool save_file (const string &path, const vector<uint8_t> &data)

    std::ofstream os;
    os.open(path.c_str(), std::ios::out | std::ios::binary);
    if (!os.is_open())
        return false;

    os.write((const char*)data.data(), data.size());
    return true;

【问题讨论】:

你确定buf包含足够的元素(300*300*4)吗? @marom,其实我不知道 buf 的高度和宽度……但我知道它的大小。请查看我的最新编辑.. 好的,我重新提出我的问题:data.size (buf.size()) 是否足够大?应该是(至少)300*300*4。 @marom,因为它来自 SDK...我不知道,所以假设它不是。如何在不定义确切高度和宽度的情况下使其动态化? 【参考方案1】:

我用QImageReader 和QBuffer 解决了类似的问题

QByteArray data = QByteArray::fromRawData(reinterpret_cast<const char*>(buf.data()), buf.size());
QBuffer buffer(data);
QImageReader reader(&buffer);
QImage img = reader.read();

【讨论】:

对你有好处,但最好给出一个想法或你的方法以便更清楚地理解.. 这里的问题是缓冲区必须有一些可移植的图像格式,如PNG或JPEG等。如果缓冲区包含原始数据,这是错误的方法。【参考方案2】:

您需要确保std::vector&lt;uint8_t&gt; &amp;buf 包含足够的图片数据。对于 QImage::Format_ARGB32 我希望每个样本需要 4 个字节,因此 buf.size() 必须至少为 300*300*4。

少了怎么办?好吧,在这种情况下,图像的大小可能不是 300x300,您需要弄清楚如何发现它。或者你可以用 '0' 填充 buf 以获得所需的大小,只是为了检查在这种情况下一切正常(或者,更好的是,没有任何不好的事情发生)

【讨论】:

我将宽度和高度更改为 50 像素。所以在你的例子中,我需要 10000 buf 大小。选择图像有 367974 buf 大小的地方......但它再次意外完成 我注意到的另一件事是,当原始文件超出范围时,您会发出信号并通过引用 (QImage &buf) 处理对象。如果你尝试通过指针传递 QImage 怎么办?【参考方案3】:

你可以用这个。

QImage img;
img.loadFromData(buf.data(), buf.size());
img.scaled(QSize(300,300), Qt::KeepAspectRatio);
...

【讨论】:

以上是关于将 std::vector<uint8_t> 转换为 QImage的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL DER ECDSA 编码错误

使用 emscripten 如何将 C++ uint8_t 数组获取到 JS Blob 或 UInt8Array

uint8_t向量的内存地址

如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?

如何正确分配和解除分配向量图

如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix