没有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
.
我使用这个
我该如何解决这个错误?
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
.