QImage:使用QImage建構函式載入影像和使用成員函式loadFromData載入影像的區別

十一的杂文录發表於2024-03-30

結論:

  QImage建構函式,既可以載入記憶體影像資料,也可以載入二進位制檔案資料

  loadFromData成員函式,只能載入二進位制檔案資料

loadFromData Qt幫助文件說明

編寫測試程式碼驗證

QImage m_img = QImage("D:1.jpg");
void Widget::on_pushButton_clicked()
{
    // 資料一:影像記憶體資料
    uchar* data = (uchar*)m_img.bits();                     // 影像資料
    int data_len = m_img.bytesPerLine() * m_img.height();   // 影像資料的長度

    // 資料二:影像二進位制資料
    QByteArray array;
    QBuffer buf(&array);
    buf.open(QIODevice::WriteOnly);
    m_img.save(&buf, "JPG");


    // 測試一:使用QImage建構函式載入影像
    // QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
    QImage img_1(data,m_img.width(),m_img.height(),QImage::Format_RGB32);
    qDebug() << "image 1:" << img_1.isNull();
    img_1.save("D:res_1.jpg");

    // 測試二:使用成員函式loadFromData載入影像(載入記憶體資料)
    // loadFromData(const uchar *data, int len, const char *format = nullptr)
    QImage img_2;
    img_2.loadFromData(data, data_len, "JPG");
    qDebug() << "image 2:" << img_2.isNull();
    img_2.save("D:res_2.jpg");

    // 測試三:使用成員函式loadFromData載入影像(載入二進位制檔案資料)
    // loadFromData(const uchar *data, int len, const char *format = nullptr)
    QImage img_3;
    img_3.loadFromData((uchar*)array.data(), array.length());
    qDebug() << "image 3:" << img_3.isNull();
    img_3.save("D:res_3.jpg");
}

相關文章