将 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);
...
我正在尝试从 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);
...