QPixmap.loadFromData() 不从 QByteArray 加载图像
QPixmap.loadFromData() does not load image from QByteArray
我正在创建一个基于套接字的程序,用于将屏幕截图从一个用户发送到另一个用户。我需要在发送之前将屏幕截图转换为字节数组。在我将屏幕截图转换为 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();
}
您的 MainWindow::on_pushButton_2_clicked
实施看起来很奇怪。你有...
QDataStream ds(&byteArray,QIODevice::ReadOnly);
创建一个只读 QDataStream
,它将从 byteArray
读取输入数据。但后来你有...
secondPixmap.loadFromData(byteArray,"JPEG");
尝试直接从 读取 QPixmap
QByteArray
-- 完全绕过 QDataStream
。
您还可以使用 QPixmap
静态成员,将 from/write 读取为 QDataStream
。所以我认为您正在寻找类似...
QDataStream ds(&byteArray,QIODevice::ReadOnly);
qint32 code;
ds >> code;
if (code == 20)
ds >> secondPixmap;
同样适用于您的 MainWindow::shootScreen
实施。您可以通过使用 QDataStream & operator<<(QDataStream &stream, const QPixmap &pixmap)
.
来减少您的代码
我正在创建一个基于套接字的程序,用于将屏幕截图从一个用户发送到另一个用户。我需要在发送之前将屏幕截图转换为字节数组。在我将屏幕截图转换为 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();
}
您的 MainWindow::on_pushButton_2_clicked
实施看起来很奇怪。你有...
QDataStream ds(&byteArray,QIODevice::ReadOnly);
创建一个只读 QDataStream
,它将从 byteArray
读取输入数据。但后来你有...
secondPixmap.loadFromData(byteArray,"JPEG");
尝试直接从 读取 QPixmap
QByteArray
-- 完全绕过 QDataStream
。
您还可以使用 QPixmap
静态成员,将 from/write 读取为 QDataStream
。所以我认为您正在寻找类似...
QDataStream ds(&byteArray,QIODevice::ReadOnly);
qint32 code;
ds >> code;
if (code == 20)
ds >> secondPixmap;
同样适用于您的 MainWindow::shootScreen
实施。您可以通过使用 QDataStream & operator<<(QDataStream &stream, const QPixmap &pixmap)
.