将原始像素数据转换为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));
}
没有错误转换为qimage的错误(无符号char*),但是qpixmap :: fromImage。
时错误。当我调试代码时,发送和接收的数据相同。
这是我的错误。错误:0xc0000005:访问违规阅读位置0xcdcdcdd1。
,并且发生在这里。
#ifdef Q_COMPILER_RVALUE_REFS
static QPixmap fromImage(QImage &&image, Qt::ImageConversionFlags flags = Qt::AutoColor)
{
return fromImageInPlace(image, flags);
}
#endif
请分享您的想法。
序列化时,将大小组件写成 sizeof strlen(rc_data)
,即 sizeof (size_t)
,它可能比 data
的含量小得多(通常是4或8个字节)。重建图像数据时,只需读取该大小,因此QImage
现在是指代表width
x height
像素的内存空间。
您需要编写data
的实际长度,才能成功地读取它。strlen(rcdata)
几乎可以肯定是错误的度量,因为它测量了无端端的字符串,您的像素数据不是。没有一个完整的例子,就不可能说出如何确定rc_data
的长度。
使用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)
更多信息:http://doc.qt.io/qt-4.8/qpixmap.html#loadfromdata
我解决了这个问题
writeBytes(rc_data,r_step*r_height)
readBytes(data,r_step*r_height)
我检查了strlen(rc_data),但是这个大小不正确。
图像的实际尺寸是步骤*高度。
谢谢你们~~~ !!!
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何将QPixMap转换为QPainterPath,反之亦然
- 将 GDI Plus 位图转换为 QPixmap
- 将原始像素数据转换为qpixmap
- Qt:将QPixmap保存到std::vector<无符号字符>-或者将QByteArray转换为std::
- 从SDL_Surface到QPixmap的高效转换
- Qt将数据转换为QPixmap
- 如何将 QIcon 转换为 QPixmap
- 转换Leptonica像素对象到QPixmap(或其他图像对象)
- 将Mat转换为QPixmap