将QImage *转换为void *,反之亦然

时间:2018-02-19 09:23:03

标签: c++ qt pointers casting qimage

我正在研究C ++ QT项目,该项目包含一些模块,这些模块通过一个控制器模块使用带签名的函数相互通信:

notify(QString stream_id, const void* stream, unsigned __int64 size)

所以我问的是如何将QT数据类型主要 QImage *转换为void * ,反之亦然,使用void指针及其大小发送数据,

我正在尝试使用此代码,但它不起作用:

    void* imageVoidPtr = static_cast<void*>(&image);

StreamListener::getInstance()->notify(QString("Stream_Name"),imageVoidPtr,sizeof(imageVoidPtr));

-------------编辑

我正在尝试使用以下方法检索数据:

    void VideoView::receive(QString stream_id, const void* stream, unsigned __int64 size){
QByteArray data = QByteArray::fromRawData(reinterpret_cast<const char*>(stream), size);
QBuffer buffer(&data);
QImageReader reader(&buffer);
QImage img = reader.read();}

--------编辑2

Void *缓冲区的大小为4或12(如果是sizeOf(QImage))并且没有给出正确的Image Bytes大小,代码有什么问题, 并且接收器中接收的图像为空(不显示错误)。

由于

4 个答案:

答案 0 :(得分:2)

令人惊讶的是,您希望这可以发挥作用。

指针只是一个整数,表示可以保存任意数据的内存地址。因此,指针始终具有相同的大小,无论它指向什么,因为它始终是一个内存地址,并且始终由固定数量的位表示,32位构建中为32位,64位构建中为64位。

QImage将数据存储在堆上。实际的类只是数据的控制器。因此,无论图像有多大,sizeof()都会为您提供相同的结果。

QImage已使用QDataStream支持序列化和反序列化:

  QImage img(100, 100, QImage::Format_Mono); // original image
  QByteArray data; // data container
  QBuffer buffer(&data); // io device
  buffer.open(QIODevice::ReadWrite);
  QDataStream stream(&buffer); // data stream
  stream << img; // save img to data 
  // you can now use the data.data() pointer, convert to void, and send data.size() number of bytes and put it into another byte array on the other side
  // then replicate the io dev and data stream steps too, omitted for brevity       
  QImage img2; // new image
  buffer.seek(0); // go to beginning of data
  stream >> img2; // read data into new image
  qDebug() << (img == img2) << data.size(); // true, it is the same content, size is 723 bytes, that includes the image format and raw data

答案 1 :(得分:1)

使用QImage save method

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG"); // writes image into ba in PNG format

您现在可以使用QByteArray基础缓冲区,如下所示:

void* imageVoidPtr = static_cast<void*>(ba.data());    
StreamListener::getInstance()->notify(QString("Stream_Name"), imageVoidPtr, ba.size());

如果您需要设置特定格式的选项(例如质量,压缩格式),请使用QImageWriter代替:

QByteArray ba;
QBuffer buffer(&ba);
QImageWriter writer(&buffer, "JPG");
writer.setQuality(100); //max quality for jpeg
writer.write(image);

在接收端,一切都应该没问题(使用QBufferQImageReader)。

答案 2 :(得分:0)

乍一看,这个问题显然导致您的代码无效:

StreamListener::getInstance()->notify(QString("Stream_Name"),imageVoidPtr,sizeof(QImage)); 

最后一个参数应该是sizeof(QImage),而不是如下:

recreate()

希望它以这种方式工作,但如果没有,如果你提到你的代码有什么问题,如果它不起作用是什么输出或错误会更好?

答案 3 :(得分:0)

我找到了这个问题的简单解决方案,

当将数据作为void *发送时,我只是将函数提供给notify函数的QImage的地址,而不需要大小:

 QImage image = CreateImage(imageStreamByteArray);
    StreamListener::getInstance()->notify(StreamsNames::VIDEO_DAT_IMAGE,&image,0);

在接收时我使用了这种类型的铸造,而不使用尺寸:

void VideoView::receive(QString stream_id, const void* stream, unsigned __int64 size){
    QImage *img = const_cast<QImage*>(reinterpret_cast<const QImage *>(stream));
   updateDisplay(img);
}

由于