【问题标题】:How to convert QImage to QByteArray?如何将 QImage 转换为 QByteArray?
【发布时间】:2026-02-10 14:00:01
【问题描述】:

我正在尝试从 QImage 创建 QByteArray,但是虽然我尝试了很多不同的方法,但我无法处理它。

我正在做的是:

QImage img_enrll; // <--- There is an image coming from another function. 

QByteArray arr((char*)img_enrll.bits(),img_enrll.byteCount());  // <-- convertion but I am not sure it is true or not. 

funcCheck((unsigned char*)arr.data(), arr.size(), 0, &sam, 1, &n);


virtual Error funcCheck (const uint8_t    src[],
                           size_t           src_len,
                           size_t           tout_ms,
                           IRawSample*      dst[],
                           size_t           dst_len,
                           size_t*          dst_n )

但是错误代码返回无效数据。我认为将 QImage 转换为 QByteArray 是错误的。请你能帮我如何转换为 QByteArray 吗?

【问题讨论】:

    标签: c++ qt qtgui qimage qbytearray


    【解决方案1】:

    你可以这样做:

    QImage img_enrll;
    QByteArray arr;
    QBuffer buffer(&arr);
    buffer.open(QIODevice::WriteOnly);
    img_enrll.save(&buffer, "yourformat");
    

    写完之后,如果你需要这个序列化,你最好使用QDataStream

    【讨论】:

    • 哦,谢谢,我之前也试过这个解决方案。但是 QDataStream 让我知道如何解决这个问题。而且效果很好:)
    • 嗯,我在 Qt 文档中看到了这个解决方案,但在我的情况下缓冲区仍然是空的。即,Q_ASSERT(buffer.data().size() &gt; 0); 抛出异常。当然,我已经检查了 QImage 是否有效:我已经从文件中加载它,转换为 QPixmap 并在 QLabel 中显示它。
    【解决方案2】:

    试试这个:

    QByteArray arr = QByteArray::fromRawData((const char*)img.bits(), img.byteCount());
    

    【讨论】:

    • 不强制转换为const char* 截断const uchar* 是吗?
    【解决方案3】:

    在我的情况下,我需要一个深层副本,所以可行的是:

    QByteArray arr(img.byteCount(), Qt::Uninitialized) // or resize if it already exists
    memcpy(arr.data(), img.constBits(), img.byteCount());
    

    【讨论】: