QPixmap.loadFromData()不从QByteArray加载图像

时间:2016-07-12 21:38:22

标签: arrays qt bytearray qpixmap qdatastream

我正在创建一个基于套接字的程序,以便将一个用户的屏幕截图发送给另一个用户。我需要在发送之前将屏幕截图转换为字节数组。在我将屏幕截图转换为QByteArray之后,我将4个字节插入到数组的开头,以标记它是一张图片(告诉我这是一张图片而不是文字或其他内容的数字20)。

通过套接字将字节数组发送给其他用户后,收到它后,我读取前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();
}

1 个答案:

答案 0 :(得分:2)

您的MainWindow::on_pushButton_2_clicked实施看起来很奇怪。你有......

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

创建一个只读QDataStream,它将从byteArray读取它的输入数据。但是后来你有......

secondPixmap.loadFromData(byteArray,"JPEG");

尝试直接从同一 QPixmap读取QByteArray - 完全绕过QDataStream

您还可以使用读取/写入QPixmap的{​​{1}}静态成员。所以我认为你正在寻找类似的东西......

QDataStream

同样适用于QDataStream ds(&byteArray,QIODevice::ReadOnly); qint32 code; ds >> code; if (code == 20) ds >> secondPixmap; 实施。您可以通过使用QDataStream & operator<<(QDataStream &stream, const QPixmap &pixmap)来减少代码。