2017-06-23 2 views
1

私のアプリでは、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ファイルをすべて含むリリースコードを移動すると、バイト配列からイメージを読み込むことができません。

この問題を解決するにはどうすればよいですか?

+0

リリースモードで何かを印刷しようとすると、何が起こったかを見ることができます。 –

+0

@HảiPhạmLê私はすでにバイト配列のサイズを印刷しており、デバッグモードとリリースモードの両方で、またdev PCと他のPCの両方で保存されています。 – Umriyaev

+1

これまたは類似の問題である必要があります。https://stackoverflow.com/questions/6724606/include-the-jpeg-plugin-in-my-application – AlexanderVX

答えて

0

開発システムで動作している場合は、DLLがまだ不足している可能性があります。残念ながら、Qt'sは必須のDLLに対してのみ苦情を言いますが、オプションのプラグインはありますが、DLLが見つからないことを示すことなく(存在する場合のみ)何らかの機能が可能です。エラー。

<QTDIR>\plugins\imageformatsフォルダ(ここでは<QTDIR>は私の場合はC:\Qt\qt_5_6_1\msvc2010のようにQtバージョンのインストールパスです)を、実行ファイルがあるディレクトリと同じディレクトリにコピーします。デバッグとリリースのバイナリは同じフォルダに混在しているので、ビルド設定に対応するものをコピーしてください。

あなたのプロジェクトのディレクトリには、次のようになります。

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

関連する問題