没有ImageProvider如何将QImage传递给qml?

How Can Pass QImage to qml without ImageProvider?

我使用这个 从 SQL 数据库中读取图像(图像以 BLOB 形式保存在数据库中)并将其传递给 qml 但我收到此错误: QML 图像:解码错误:数据:image/png;base64,77+9UE5HDQoaCg==:不支持的图像格式

我该如何解决这个错误?

cpp:

void MainWindow::saveToDatabase(QQuickItem *imageObj) {

  QSharedPointer<const QQuickItemGrabResult> grabResult =
      imageObj->grabToImage();
  connect(grabResult.data(), &QQuickItemGrabResult::ready, [=]() {
    QImage img(grabResult->image());
    QByteArray imageArray;
    QBuffer buffer(&imageArray);
    buffer.open(QIODevice::WriteOnly);
    img.save(&buffer, "PNG");
    dbModify->dbinsertRecords(imageArray);
  });
}


QString MainWindow::convertToImage(int pos) {
       //SelectLastData define as QVariantList in header
        QString base64 =
            QString::fromUtf8(SelectLastData[pos].toByteArray().toBase64().data());
        return QString("data:image/png;base64,") + base64;
    }

qml:

onClicked: {
     stackView.push("qrc:/imagePage.qml",  {"url" : mainWindow.convertToImage(9)})
           }

imagePage.qml:

Page {
    width: Screen.width
    height: Screen.height
    visible: true
    property alias url: screenshoot.source
    Rectangle {
  Image {
         id: screenshoot
       }
    }
}

错误消息中的 base64 数据:"77+9UE5HDQoaCg==" 对应字节 ef bf bd 50 4e 47 0d 0a 1a 0a,其中包含 3 个字节,PNG header 不应该存在(它应该以89 50 4e 47),这表明数据被截断,这意味着数据被读取为空终止字符串而不是二进制 blob(PNG 文件的第 9 个字节通常是空字符)。

这可能是因为您在初始化 QVariantList.

时将 char* 传递给 QVariant 而不是 QByteArray

基本上,当您将 char* 作为参数传递给其构造函数或 setValue 时,QVariant 会将其解释为以空字符结尾的 UTF-8 字符串并将其本地存储为QString,然后,当您调用 toByteArray 时,它会将其转换为 UTF-8。与 UTF-8 之间的 2 次转换可能会导致二进制数据损坏。

如果您创建一个中间 QByteArray 变量并直接使用它来初始化 QVariant,它将被存储为 QByteArray 并且当您调用 toByteArray.