【发布时间】:2016-12-08 06:11:04
【问题描述】:
我正在尝试将原始像素数据转换为 QPixmap,但在将 qimage 转换为 qpixmap 时出错。
首先,我通过 qlocalsocket 从服务器 A 发送原始数据,客户端 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();
}
}
这是客户 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));
}
将 (unsigned char*) 数据转换为 QImage 没有错误,但在 QPixmap::fromImage 时出错。
当我调试代码时,发送和接收的数据是相同的。
这是我的错误。 错误:0xC0000005:访问冲突读取位置 0xCDCDCDD1。
并且发生在这里。
#ifdef Q_COMPILER_RVALUE_REFS
static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
{
return fromImageInPlace(image, flags);
}
#endif
请分享您的想法,谢谢。
【问题讨论】:
-
你得到的错误是什么?
-
我更新了它。错误:0xC0000005:访问冲突读取位置 0xCDCDCDD1。
-
当你的客户端sn-p中的代码执行时,你确定所有的数据都可用吗?在您的代码中添加一些检查。检查有多少字节可用,并检查
data是否为null以及size在in.readBytes之后的值。QDataStream::readBytes的第二个参数不是要读取的大小,是用来获取缓冲区的大小。 -
我试过这样,out.writeBytes(rc_data, sizeof(strlen(rc_data))); in.readBytes(数据,大小); ?? //size 是 sizeof(strlen(rc_data))// 但是当我这样使用时,我只能读取 4 个字节的 rc_data。因为 sizeof(strlen) 是 4bytes。
标签: c++ qt qimage qpixmap raw-data