将原始像素数据转换为qpixmap

Converting raw pixel data to QPixmap

本文关键字:转换 qpixmap 数据 像素数 原始 像素      更新时间:2023-10-16

我正在尝试将原始像素数据转换为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),但是这个大小不正确。

图像的实际尺寸是步骤*高度。

谢谢你们~~~ !!!