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

时间:2015-06-29 08:36:31

标签: c++ qt vector 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;
}

3 个答案:

答案 0 :(得分:2)

我用QImageReaderQBuffer

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以使用它。

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