2017-07-06 32 views
0

我開始學習Qt,我想用縮略圖在文件夾中製作簡單的圖像列表。我設法得到了它的工作,但它似乎隨機加載500中只有大約1個圖像,而50中的1個圖像是黑色的(下面的屏幕截圖)。一旦滾動,縮略圖可能不會再次加載,而這次可能會加載其他一些縮略圖。對於我使用libraw的原始圖像。QQuickImageProvider只加載大約1%的原始圖像

幾點意見:

2017年7月7日 - 我想檢查,如果問題不是由破碎的文件造成的。雖然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和模型代表

圖像
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)); 
} 

我真的跑出去的想法如何,我可以解決這個問題,任何幫助將是......嗯......有幫助

this is how it looks

+0

如果你在任何地方顯示相同的圖像,它是否工作?你可以使用'QWidget'來展示它們嗎? – m7913d

+0

如果我添加一個圖像多(100)次,它會加載每一個沒有問題。我剛剛學會了如何用'QtQuick'做某事,但從來沒有嘗試'QWidget',但我可以嘗試它,但它可能需要一些時間。 – adsamcik

+0

@ m7913d我用更好的示例試了一下,要麼全部都加載,要麼全都不加載。他們似乎有着同樣的命運。我是否重複項目(p1 p1 p2 p2 p3 p3 p4 p4)或組(p1 p2 p3 p4 p1 p2 p3 p4)似乎沒有關係,它的行爲總是相同的。 – adsamcik

回答

1

問題是非常簡單的。 Libraw的jpg縮略圖實際上只是jpg的原始圖像(我沒有意識到這一點,我的糟糕),QtQuick無法處理它提供的圖像大小。這就是爲什麼它用少量圖像就可以正常工作,但失敗的可能性更大。這個解決方案比將縮略圖縮小到更小的尺寸,理想情況下恰好是qml中圖像的大小。

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