2016-07-12 4 views
1

私はソケットベースのプログラムを作成して、あるユーザーから別のユーザーにスクリーンショットを送信します。送信する前に、スクリーンショットをバイト配列に変換する必要があります。スクリーンショットをQByteArrayに変換した後、配列の先頭に4バイトを挿入してピクチャであることを示します(ピクチャであり、テキストなどではないことを示す番号20です)。QPixmap.loadFromData()はQByteArrayから画像をロードしません。

バイト配列をソケット経由で他のユーザーに送信した後、受け取ったときに最初の4バイトを読み取ってその内容を認識します。画像だったので、それをQByteArrayからQPixmapに変換してラベルに表示します。私はsecondPixmap.loadFromData(byteArray,"JPEG")を使用して読み込みますが、画像はロードされません。

これは私のコードのサンプルです:

void MainWindow::shootScreen() 
{ 
    originalPixmap = QPixmap(); // clear image for low memory situations 
          // on embedded devices. 
    originalPixmap = QGuiApplication::primaryScreen()->grabWindow(0); 
    scaledPixmap = originalPixmap.scaled(500, 500); 

    QByteArray bArray; 
    QBuffer buffer(&bArray); 
    buffer.open(QIODevice::WriteOnly); 
    originalPixmap.save(&buffer,"JPEG",5); 

    qDebug() << bArray.size() << "diz0"; 

    byteArray= QByteArray(); 

    QDataStream ds(&byteArray,QIODevice::ReadWrite); 
    int32_t c = 20; 
    ds << c; 
    ds<<bArray; 
} 

void MainWindow::updateScreenshotLabel() 
{ 
    this->ui->label->setPixmap(secondPixmap.scaled(this->ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    shootScreen(); 
} 

void MainWindow::on_pushButton_2_clicked() 
{ 
    secondPixmap = QPixmap(); 
    QDataStream ds(&byteArray,QIODevice::ReadOnly); 
    qint32 code; 
    ds>>code; 
    secondPixmap.loadFromData(byteArray,"JPEG"); 
    updateScreenshotLabel(); 
} 

答えて

2

あなたMainWindow::on_pushButton_2_clicked実装は奇妙に見えます。あなたは...それはbyteArrayからの入力データを読み込んだだろう読み取り専用QDataStreamを作成

QDataStream ds(&byteArray,QIODevice::ReadOnly); 

を持っています。完全QDataStreamバイパス - しかし、その後、あなたは... 同じQByteArrayから直接QPixmapを読み取ろうと

secondPixmap.loadFromData(byteArray,"JPEG"); 

を持っています。

QDataStreamとの間で読み書きする固定メンバーQPixmapを使用することもできます。だから私はあなたが何かあなたのMainWindow::shootScreen実装のような...

QDataStream ds(&byteArray,QIODevice::ReadOnly); 
qint32 code; 
ds >> code; 
if (code == 20) 
    ds >> secondPixmap; 

と同様に探していると思います。 QDataStream & operator<<(QDataStream &stream, const QPixmap &pixmap)を使用することで、コードをかなり減らすことができます。

+0

ありがとうございます。 – amir

関連する問題