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

Convert std::vector<uint8_t> to QImage

我正在尝试从 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;
}

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

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

我用 QImageReader and QBuffer

解决了类似的问题
QByteArray data = QByteArray::fromRawData(reinterpret_cast<const char*>(buf.data()), buf.size());
QBuffer buffer(data);
QImageReader reader(&buffer);
QImage img = reader.read();

你可以用这个。

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