C++ 转换标准::向量<;uint8_t>;齐玛格

C++ 转换标准::向量<;uint8_t>;齐玛格,c++,qt,vector,qimage,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); } 我的应用程序总是出人意料地完成。你能帮助我如何正确地转换成QImage吗 编辑: 我可以将图像写入

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

void FaceCutThread::convertImage(std::vector<uint8_t> &buf)
{
    QImage img(&buf[0], 300, 300, QImage::Format_ARGB32);

    emit isFinisedFaceCut(img);
}
我的应用程序总是出人意料地完成。你能帮助我如何正确地转换成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;
}
bool保存文件(常量字符串和路径、常量向量和数据)
{
std::流操作系统;
open(path.c_str(),std::ios::out | std::ios::binary);
如果(!os.is_open())
返回false;
写((const char*)data.data(),data.size());
返回true;
}

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


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

我解决了与和类似的问题

QByteArray data=QByteArray::fromRawData(重新解释强制转换(buf.data()),buf.size());
QBuffer(数据);
QImageReader读取器(&缓冲区);
QImage img=reader.read();
您可以使用这个

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

你确定buf包含足够的元素(300*300*4)吗?@marom,实际上我不知道buf的高度和宽度。。。但我知道它的大小。请看我的最新编辑。好的,我重新表述了我的问题:data.size(buf.size())足够大吗?应该是(至少)300*300*4。@marom,因为它来自SDK。。。我不知道,所以假设不是。如何使其动态化,而不定义精确的高度和宽度?我将宽度和高度更改为50px。所以在你的例子中,我需要10000个buf大小。其中选择图像的大小为367974 buf。。。但它又出乎意料地完成了另一件事,我没有注意到的是,当原始对象超出范围时,您会发出信号并通过引用处理对象(QImage&buf)。如果您试图通过指针传递QImage会怎么样?这对您很好,但是最好给出一个想法或您的方法来更清楚地理解。这里的问题是缓冲区必须具有一些可移植的图像格式,如PNG或JPEG等。如果缓冲区包含原始数据,这是错误的方法。
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;
}
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);
...