将 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<uint8_t> &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的主要内容,如果未能解决你的问题,请参考以下文章
使用 emscripten 如何将 C++ uint8_t 数组获取到 JS Blob 或 UInt8Array
如何将 std::vector<std::vector<double>> 转换为 torch::Tensor?
如何将 std::vector<std::vector<double>> 转换为 Rcpp::Dataframe 或 Rcpp::NumericMatrix