【问题标题】:Converting raw pixel data to QPixmap将原始像素数据转换为 QPixmap
【发布时间】: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 以及sizein.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


【解决方案1】:

序列化时,将大小组件写为sizeof strlen(rc_data),即sizeof (size_t),它可能比data的内容小得多(通常为4或8个字节)。当您重建图像数据时,您只会读取该大小,因此QImage 现在指的是内存空间,它没有像表示widthxheight 像素所需的那么大。

您需要写入data 的实际长度才能成功读取它。 strlen(rcdata) 几乎可以肯定是错误的度量,因为它测量以空字符结尾的字符串,而您的像素数据不是。如果没有完整的示例,就无法告诉您应该如何确定rc_data 的长度。

【讨论】:

  • 你的意思是我必须像这样使用? out.writeBytes(rc_data, sizeof(strlen(rc_data))); in.readBytes(data, size); ?? //size 是 sizeof(strlen(rc_data)) 但是当我这样使用时,我只能读取 4 个字节的 rc_data。因为 sizeof(strlen) 是 4bytes..
  • rcdata 需要包含width * height * bytes_per_pixel 字节,所以如果你知道这三个数字,你应该能够计算它。由于您传递的是QImage::Format::Format_RGB888,所以您知道bytes_per_pixel 是3。
【解决方案2】:

使用 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

【讨论】:

  • 这并不能解决问题(大多数引用的数据从未被读取过)。
【解决方案3】:

我解决了这个问题

    writeBytes(rc_data,r_step*r_height)
    readBytes(data,r_step*r_height)

我检查了 strlen(rc_data),但这个大小不正确。

图片的实际尺寸为步长*高度。

谢谢大家~~~!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多