2017-06-23 8 views
1

Dans mon application, je reçois des images au format JPEG à partir d'un périphérique Android sur QTcpSocket en tant que tableau d'octets.Impossible de charger QImage à partir du tableau d'octets en mode de publication

Quand je lance cette application sur mon dev PC, il fonctionne comme un charme (à la fois dans le débogage et la libération des modes). Cependant, je ne suis pas en mesure de charger QImage à partir d'un tableau d'octets sur un autre PC où Qt n'est pas installé.

J'inclus tous les fichiers .dll * dans Qt pour ma plate-forme (Windows x64, msvc_2015_64) et également installé Visual Studio C++ redistribuable 2015. Mon application commence bien (ne donne pas d'erreurs que certains fichiers * .dll sont disparu). Mais QImage est vide tout le temps.

D'abord, je pense que tableau d'octets n'a pas reçu du tout, donc j'ai vérifié sa taille et a constaté qu'il est correctement reçu.

J'utilise ce code pour charger QImage de uchar octets:

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

et je reçois ces octets de 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); 
} 

Comme vous le voyez, je reçois d'abord la taille de la image en tant que longueur du tableau d'octets. Ensuite, j'attends que tous les octets requis soient reçus et prêts dans le tampon de QTcpSocket. Ensuite, je crée un pointeur sur le tableau d'octets avec une taille suffisante, charge les octets entrants vers ce tableau et appelle la méthode handleImageBytes ci-dessus.

Tout cela fonctionne très bien sur mon dev PC (Windows 7 x64, Qt 5.7, msvc_2015_64). Cependant, le chargement d'images à partir d'un tableau d'octets ne fonctionne pas lorsque je déplace mon code d'édition avec tous les fichiers * .dll requis vers un autre ordinateur sur lequel Qt n'est pas installé.

Comment résoudre ce problème?

+0

pouvez essayer d'imprimer quelque chose dans le mode de libération, afin que vous puissiez voir ce qui est arrivé. –

+0

@ Hải Phạm Lê Je suis déjà en train d'imprimer la taille du tableau d'octets entrants et c'est enregistrer à la fois dans les modes de débogage et de relâchement, et aussi bien dans les PC de développement que dans les autres PC. – Umriyaev

+1

Doit être ceci ou un problème similaire: https://stackoverflow.com/questions/6724606/include-the-jpeg-plugin-in-my-application – AlexanderVX

Répondre

0

Si elle travaille dans votre système de développement, alors vous êtes probablement encore une DLL manquante. Malheureusement, Qt de se plaindra que pour les DLL obligatoires, mais il en existe d'autres, les plug-ins, qui sont facultatifs, et certaines fonctionnalités ne seront possibles que si elles sont présentes (telles que la lecture de certains formats d'images) sans montrer aucune DLL manquante erreur .

Copiez le dossier <QTDIR>\plugins\imageformats (où <QTDIR> est le chemin d'installation de votre version Qt, comme C:\Qt\qt_5_6_1\msvc2010 dans mon cas) dans le même répertoire où votre exécutable est. Sachez que les binaires de débogage et de publication sont mélangés dans le même dossier, il suffit donc de copier ceux qui correspondent à votre configuration de construction.

Votre projet dir devrait ressembler à:

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

Le Qt VS Add-on ajoute automatiquement certains répertoires sur le chemin, c'est la raison pour laquelle il ne manque pas lorsqu'il est exécuté à partir de l'IDE.

Note: si vous souhaitez utiliser des images SVG, vous devrez copier aussi iconengines\qsvgicon.dll et Qt5Svg.dll.

+0

Merci pour votre réponse. Le commentaire de @AlexanderVX a été utile aussi. J'ai résolu mon problème après son commentaire. Et votre réponse est similaire à l'article qu'il a pointé, j'ai donc accepté votre réponse comme réponse à mon message. – Umriyaev