2017-06-23 73 views
1

在我的應用中,我通過QTcpSocket以字節數組的形式從Android設備接收格式爲JPEG的圖像。無法在發佈模式下從字節數組加載QImage

當我在我的開發PC上運行這個應用程序時,它就像一個魅力(無論是在調試和發佈模式)。但是,我無法從未安裝Qt的另一臺PC上的字節數組中加載QImage

我在Qt中爲我的平臺(Windows x64,msvc_2015_64)包含了所有* .dll文件,並且還安裝了Visual Studio C++ Redistributable 2015.我的應用程序啓動正常(不給出任何錯誤,某些* .dll文件是失蹤)。但是QImage一直都是空的。

首先,我認爲字節數組根本沒有被接收到,所以我檢查了它的大小,發現它被正確接收。

我使用這個代碼從uchar字節加載QImage

void handleImageBytes(uchar *bytes, qint64 length) 
{ 
    QImage image; 
    image.loadFromData(bytes, length, "JPEG"); 
    emit frameReady(image); 
} 

我收到這些字節從QTcpSocket

void handleReadyRead() 
{ 
    if(this->incomingFrameLength==0){ 
     QString data = this->client->readAll(); 
     this->incomingFrameLength = data.toInt(); 
     this->client->write("ok"); 
     qDebug()<<QString("Received frame length: %1").arg(this->incomingFrameLength); 
     return; 
    } 

    if(this->incomingFrameLength!=0 && this->client->bytesAvailable()<this->incomingFrameLength) 
     return; 

    uchar* data = (uchar*)malloc(this->incomingFrameLength+256); 
    qint64 len = this->client->read((char*)data, this->incomingFrameLength+256); 

    qDebug() << QString("Received %1 bytes").arg(len); 

    handleImageBytes(data, len); 

    this->incomingFrameLength=0; 
    this->client->write("received"); 
    qDebug()<<QString("Received frame of length %1").arg(len); 
    free(data); 
} 

正如你看到的,第一我收到的大小圖像作爲字節數組的長度。 然後我等待在QTcpSocket的緩衝區中收到並準備好所有需要的字節。然後,我創建指向具有足夠大小的字節數組的指針,將傳入字節加載到該數組,並從上面調用handleImageBytes方法。

這一切工作正常我的開發電腦(Windows 7 x64,Qt 5.7,msvc_2015_64)。 但是,當我將包含所有必需的* .dll文件的發佈代碼移動到未安裝Qt的其他PC時,從字節數組加載圖像不起作用。

如何解決這個問題?

+0

可以嘗試在發佈模式下打印出某些內容,以便您可以看到發生了什麼。 –

+0

@HảiPhạmLê我已經打印了傳入字節數組的大小,並且它在調試和發佈模式下以及在開發PC和其他PC中都可以保存。 – Umriyaev

+1

必須是這個或類似的問題:https://stackoverflow.com/questions/6724606/include-the-jpeg-plugin-in-my-application – AlexanderVX

回答

0

如果它在你的開發系統中工作,那麼可能你仍然缺少一些DLL。不幸的是,Qt只會抱怨強制性的DLL,但還有其他的插件是可選的,只有當它們存在時(例如讀取一些圖像格式),某些功能纔可能沒有顯示任何DLL丟失錯誤。

複製<QTDIR>\plugins\imageformats文件夾(其中<QTDIR>是您的Qt版本的安裝路徑,例如C:\Qt\qt_5_6_1\msvc2010在我的情況下)到您的可執行文件所在的目錄。請注意,調試和發行版二進制文件混合在同一個文件夾中,因此只需複製與您的構建配置相對應的文件即可。

您的項目目錄應該是這個樣子:

project\ 
     project.exe 
     Qt5Core.dll 
     Qt5Gui.dll 
     ... 
     imageformats\ 
        qgif.dll 
        qico.dll 
        qjpeg.dll 
        ... 

Qt的VS附加自動添加一些目錄的路徑,這就是爲什麼在IDE中運行時,它不會失敗。

注意:如果你想使用SVG圖像,你還必須複製iconengines\qsvgicon.dllQt5Svg.dll

+0

謝謝你的回答。 @AlexanderVX的評論也有幫助。他的評論後我解決了我的問題。你的回答與他指出的帖子很相似,所以我接受你的回答作爲我的帖子的答案。 – Umriyaev

相關問題