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?
pouvez essayer d'imprimer quelque chose dans le mode de libération, afin que vous puissiez voir ce qui est arrivé. –
@ 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
Doit être ceci ou un problème similaire: https://stackoverflow.com/questions/6724606/include-the-jpeg-plugin-in-my-application – AlexanderVX