2016-12-08 27 views
0

生のピクセルデータをQPixmapに変換しようとしましたが、qimageをqpixmapに変換中にエラーが発生しました。生のピクセルデータをQPixmapに変換する

まず、サーバAから生データをqlocalsocketで送信し、クライアントBがそれを取得します。

これはA.

if (clientSocket) 
    { 
     if (clientSocket->isOpen()) 
     { 
      QByteArray block; 
      QDataStream out(&block, QIODevice::WriteOnly); 

      out.setVersion(QDataStream::Qt_5_7); 
      const char* rc_data = reinterpret_cast<const char*>(r_data); 
      out <<sizeof(strlen(rc_data))<< r_width << r_height << r_step; 
      out.writeBytes(rc_data, strlen(rc_data)); 

      clientSocket->write(block); 
      clientSocket->flush(); 
     } 
    } 

サーバーですこれはエラーがQPixmapの:: fromImageながらQImageのに(unsigned char型*)データを変換しますが、エラーはありませんクライアントB.

QByteArray block = connection->readAll(); 
    QDataStream in(&block, QIODevice::ReadOnly); 
    in.setVersion(QDataStream::Qt_5_7); 
    char* data; 
    size_t size; 
    int width; 
    int height; 
    int step; 
    while (!in.atEnd()) 
    { 
     in >> size >> width >> height >> step; 
     in.readBytes(data,size); 
    } 
    mutex.lock(); 
    receivePixmap = QPixmap::fromImage(QImage((unsigned char*)data, width, height, step, QImage::Format::Format_RGB888)); 
    mutex.unlock(); 
    ui.label->setPixmap(receivePixmap.scaled(ui.label->size(), Qt::KeepAspectRatio)); 
} 

です。

コードをデバッグすると、送信され受信されるデータは同じになります。

これは私のエラーです。 エラー:0xC0000005:0xCDCDCDD1の場所を読み取るアクセス違反。

ここで発生します。

#ifdef Q_COMPILER_RVALUE_REFS 

    static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor) 
     { 
    return fromImageInPlace(image, flags); 
    } 
    #endif 

アイデアを感謝してください。

+0

エラーは何ですか? – thuga

+0

私はそれを更新しました。 エラー:0xC0000005:0xCDCDCDD1の場所を読み取るアクセス違反。 –

+0

クライアントスニペットのコードが実行されたときに、すべてのデータが利用可能になっていますか?コードにいくつかのチェックを追加します。使用可能なバイト数を確認し、 'data'が' null'で、 'in.readBytes'の後に' size'の値があるかどうかを確認してください。 'QDataStream :: readBytes'の2番目のパラメータは読み込むサイズではなく、バッファのサイズを取得するために使用されます。 – thuga

答えて

0

私はこの問題に

writeBytes(rc_data,r_step*r_height) 
    readBytes(data,r_step*r_height) 

を解決し、私はSTRLEN(rc_data)をチェックしますが、このサイズが正しくありません。

実際の画像サイズは、高さ×高さです。

ありがとう~~~ !!!

-1

使用QPixmapののloadFromData方法:

bool QPixmap::loadFromData(const uchar * data, uint len, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor) 

それとも

bool QPixmap::loadFromData(const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor) 

さらに詳しい情報:あなたはシリアライズするとhttp://doc.qt.io/qt-4.8/qpixmap.html#loadFromData

+0

それは問題を解決しません(参照されたデータのほとんどが一度も読み込まれていない)。 –

1

、あなたがsizeof strlen(rc_data)としてサイズのコンポーネントを書き込む、すなわちsizeof (size_t)、そうですdata(それはしばしば4または8バイトです)の内容よりはるかに小さいです。イメージデータを再構成するときには、そのサイズだけを読み取るので、 x heightピクセルを表すのに必要な大きさでないメモリスペースをQImageが参照するようになりました。

正常に読み返すには、実際の長さをdataにする必要があります。 strlen(rcdata)は、ピクセルデータではないヌルで終了する文字列を測定するため、ほぼ間違った方法です。完全な例がなければ、rc_dataの長さをどのように決定すべきかは分かりません。

+0

あなたは私がこれらのように使用しなければならないことを意味しますか? ** out.writeBytes(rc_data、sizeof(strlen(rc_data))); ** ** in.readBytes(data、size); ** // sizeof sizeof(strlen(rc_data)) しかし、私がそのように使うと、私は4バイトのrc_dataを読むことができます。 sizeof(strlen)は4bytesです。 –

+0

どのようにしてrc_dataのサイズを測定できますか????あなたは何か考えていますか? –

+0

'rcdata'は' width * height * bytes_per_pixel'バイトを含んでいる必要があります。その3つの数字を知っていれば計算できるはずです。 'QImage :: Format :: Format_RGB888'を渡しているので、' bytes_per_pixel'は3です。 –

関連する問題