将原始像素数据转换为 QPixmap
Converting raw pixel data to QPixmap
我正在尝试将原始像素数据转换为 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*)data 转换为 QImage 没有错误,但在 QPixmap::fromImage.
时出错
当我调试代码时,发送和接收的数据是一样的。
这是我的错误。
错误:0xC0000005:读取位置 0xCDDCDD1 的访问冲突。
并发生在这里。
#ifdef Q_COMPILER_RVALUE_REFS
static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
{
return fromImageInPlace(image, flags);
}
#endif
请分享您的想法谢谢。
使用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)
当你序列化时,你将大小组件写成sizeof strlen(rc_data)
,即sizeof (size_t)
,这可能比data
的内容小得多(通常是4或8个字节) .当您重建图像数据时,您只读取该大小,因此 QImage
现在指的是内存 space,它没有表示 width
x[=15= 所需的那么大]像素。
您需要写入data
的实际长度才能成功读回。 strlen(rcdata)
几乎可以肯定是错误的衡量标准,因为它衡量的是以空字符结尾的字符串,而您的像素数据不是。没有完整的示例,就无法告诉您应该如何确定 rc_data
.
的长度
我解决了这个问题
writeBytes(rc_data,r_step*r_height)
readBytes(data,r_step*r_height)
我检查了 strlen(rc_data),但是这个大小不正确。
图片的实际尺寸为步长*高度。
谢谢大家~~~!!!
我正在尝试将原始像素数据转换为 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*)data 转换为 QImage 没有错误,但在 QPixmap::fromImage.
时出错当我调试代码时,发送和接收的数据是一样的。
这是我的错误。 错误:0xC0000005:读取位置 0xCDDCDD1 的访问冲突。
并发生在这里。
#ifdef Q_COMPILER_RVALUE_REFS
static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
{
return fromImageInPlace(image, flags);
}
#endif
请分享您的想法谢谢。
使用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)
当你序列化时,你将大小组件写成sizeof strlen(rc_data)
,即sizeof (size_t)
,这可能比data
的内容小得多(通常是4或8个字节) .当您重建图像数据时,您只读取该大小,因此 QImage
现在指的是内存 space,它没有表示 width
x[=15= 所需的那么大]像素。
您需要写入data
的实际长度才能成功读回。 strlen(rcdata)
几乎可以肯定是错误的衡量标准,因为它衡量的是以空字符结尾的字符串,而您的像素数据不是。没有完整的示例,就无法告诉您应该如何确定 rc_data
.
我解决了这个问题
writeBytes(rc_data,r_step*r_height)
readBytes(data,r_step*r_height)
我检查了 strlen(rc_data),但是这个大小不正确。
图片的实际尺寸为步长*高度。
谢谢大家~~~!!!