【问题标题】:QQuickImageProvider loads only around 1% of raw imagesQQuickImageProvider 仅加载大约 1% 的原始图像
【发布时间】:2017-12-10 14:55:31
【问题描述】:

我开始学习 Qt,我想用缩略图在文件夹中制作简单的图像列表。我设法让它工作起来,但它似乎只随机加载了 500 个图像中的大约 1 个图像,而 50 个图像中的 1 个图像是黑色的(下面的屏幕截图)。滚动后,缩略图可能不会再次加载,这次可能会加载其他一些。对于原始图像,我使用 libraw。

观察很少:

7.7.2017 - 我试图检查问题是否不是由损坏的文件引起的。虽然 libraw 说缩略图是 jpg,但它们似乎不是,因为普通浏览器无法浏览成功或失败的尝试,但更好的编辑器可以同时打开两者。因此,问题似乎不在于将损坏的数据提供给 QImage

当我硬编码几张要加载的照片时,当照片较少时,它们几乎总是能正确加载。随着数量的增加,它们突然可能全部变黑或根本不加载。也许是多线程问题?

Libraw 似乎总是能正确加载文件。我通过在文件加载和没有加载时在文件中间打印足够的字节来测试它

当图像为黑色时,它认为一切正常,当图像根本没有加载时,是因为 QImage 的内容为空。

当我多次添加一张图片时,所有副本都有相同的命运(要么全部加载要么全部失败)

QImage RawImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) {
LibRaw rawProc;
auto state = rawProc.open_file(id.toLatin1().data());
QImage thumbnail;
if(LIBRAW_SUCCESS == state) {
    if(LIBRAW_SUCCESS == rawProc.unpack_thumb()) {
        if (LIBRAW_THUMBNAIL_JPEG == rawProc.imgdata.thumbnail.tformat) {
            thumbnail.loadFromData((unsigned char*)rawProc.imgdata.thumbnail.thumb, rawProc.imgdata.thumbnail.tlength, "JPEG");
        }
    }
    rawProc.recycle();
}
return thumbnail;
}

为了显示我使用 gridview 和 model-delegate 的图像

GridView {
    id: gridView
    anchors.rightMargin: 6
    anchors.leftMargin: 6
    anchors.bottomMargin: 6
    anchors.topMargin: 46
    anchors.fill: parent
    cellHeight: 200
    cellWidth: 185
    model: imageModel
    delegate: PhotoDelegate {}
}

原始图像提供者和模型在主函数中是这样注册的

int main(int argc, char *argv[])
{
...
QQmlApplicationEngine engine;
engine.addImageProvider(QLatin1String("rawProvider"), new RawImageProvider);

AppData::setContext(engine.rootContext());
AppData::notifyContext();
...
}

AppData 是我的“静态”类,它包含从中创建模型的列表和指向上下文的指针,因此我可以从 qml(文件浏览器)调用的其他类轻松访问和更新这些值。每次数据发生变化时,模型的更新都是按照如下方式进行的。

void AppData::notifyContext() {
     context->setContextProperty("imageModel", QVariant::fromValue(dataList));
}

我真的想不出如何解决这个问题,任何帮助都会......嗯......有帮助

【问题讨论】:

  • 如果您在任何地方都显示相同的图像,它会起作用吗?您可以使用QWidget 向他们展示吗?
  • 如果我将一张图片添加多次 (100) 次,它会毫无问题地加载每一张图片。我刚刚学会了如何以某种方式使用 QtQuick 从未尝试过 QWidget 但我可以尝试,不过可能需要一些时间。
  • @m7913d 我用更好的样本进行了尝试,要么全部加载,要么都不加载。他们似乎有着相同的命运。我是否复制项目(p1 p1 p2 p2 p3 p3 p4 p4)或组(p1 p2 p3 p4 p1 p2 p3 p4)似乎并不重要,它的行为总是相同的。

标签: qt qtquick2 qtquickcontrols2


【解决方案1】:

问题很简单。 Libraw 的 jpg 缩略图实际上只是 jpg 的原始图像(我不知道这一点,我的错)并且 QtQuick 无法处理它提供的图像的大小。这就是为什么它在更少的图像上工作得很好,但在更多的图像上却失败了。解决方案是将调整大小的缩略图返回到更小的尺寸,理想情况下与 qml 中图像的尺寸完全相同。

 return thumbnail.scaled(320, 320).scaled(160, 160, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2017-04-24
    • 2023-03-25
    相关资源
    最近更新 更多