将qimage*转换为void*,反之亦然
Convert QImage* to void* and vice versa
我正在从事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);
在接收端,一切都应该没问题(使用QBuffer
和QImageReader
(。
一见钟情,这显然导致您的代码无法正常工作:
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);
}
谢谢
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- 将qimage*转换为void*,反之亦然