私のアプリでは、QTcpSocket
を超えるバイト配列としてJPEG
形式の画像をAndroidデバイスから受信しました。リリースモードでバイト配列からQImageを読み込むことができません
dev PCでこのアプリケーションを実行すると、デバッグモードとリリースモードの両方でチャームのように機能します。しかし、Qtがインストールされていない別のPCにバイト配列からQImage
をロードすることはできません。
私のプラットフォーム(Windows x64、msvc_2015_64)にはすべての* .dllファイルが含まれ、Visual Studio C++ Redistributable 2015もインストールされています。*私のアプリはうまく始まります。不足している)。しかし、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
メソッドを呼び出します。
これはすべて私のdev PC(Windows 7 x64、Qt 5.7、msvc_2015_64)で正常に動作します。 しかし、Qtがインストールされていない他のPCに必要な* .dllファイルをすべて含むリリースコードを移動すると、バイト配列からイメージを読み込むことができません。
この問題を解決するにはどうすればよいですか?
リリースモードで何かを印刷しようとすると、何が起こったかを見ることができます。 –
@HảiPhạmLê私はすでにバイト配列のサイズを印刷しており、デバッグモードとリリースモードの両方で、またdev PCと他のPCの両方で保存されています。 – Umriyaev
これまたは類似の問題である必要があります。https://stackoverflow.com/questions/6724606/include-the-jpeg-plugin-in-my-application – AlexanderVX