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

Convert QImage* to void* and vice versa

本文关键字:反之亦然 void 转换 qimage      更新时间:2023-10-16

我正在从事C QT项目,其中包含一些模块通过一个控制器模块使用具有签名的函数相互通信:

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

因此,我询问如何将QT数据类型转换为 qimage*为void* ,反之亦然,以使用void Pointer及其大小来发送数据,

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

    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* buffer的大小为4或12的代码有什么问题(如果是sizeof(qimage((,而不是给出图像字节大小的正确大小,并且接收器中接收的图像为空(没有出现错误(。

谢谢

令人惊讶的是,您期望它能起作用。

指针只是一个整数编号,它代表可能容纳任意数据的内存地址。因此,指针始终是相同的大小,无论它指的是什么,因为它始终是一个内存地址,并且始终由固定数量的位代表,在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

使用QImage保存方法:

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(。

一见钟情,这显然导致您的代码无法正常工作:

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

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

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

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

我找到了一个简单的解决方案,

就像在将数据发送为void*时一样,我只是将函数授予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);
}

谢谢