如何在 Qt显示内存里的图像数据

如何在 Qt显示内存里的图像数据,第1张

当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转) *** 作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。

下面以灰度相机为例,介绍封装方法:

第一步:首先根据相机的SDK内的读图像函数,获取图像数据imgData、宽度imgWidth和高度imHeight。

第二步:申请QImage对象,注意类型是Format_RGB32

第三步:利用成员函数setPixel()设置QImage像素。由于相机输出的图像是灰度图像,每一位置的R、G、B分量相等且均等于当前位置的像素值。

具体程序如下:[cpp]

QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32

//RGB分量值int b = 0;int g = 0;int r = 0;//设置像素

for (int i=0;i<imgHeight;i++){

for (int j=0;j<imgWidth;j++){

b = (int)(imgDataNew+iimgWidth+j);g = b;r = g;

desImagesetPixel(j,i,qRgb(r,g,b));}}QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32

//RGB分量值int b = 0;int g = 0;int r = 0;//设置像素

for (int i=0;i<imgHeight;i++){

for (int j=0;j<imgWidth;j++){

b = (int)(imgDataNew+iimgWidth+j);g = b;r = g;

desImagesetPixel(j,i,qRgb(r,g,b));}}

对于灰度图像数据,如下封装方式是错误的。

1,加载一张,使用GDI+的Bitmap类,创建一个对象,Bitmap bitmap=Bitmap::FromFile("examplepng");

2,从Bitmap对象中获得HBITMAP句柄,HBITMAP句柄指向位图

HBITMAP hBMP; bitmap->GetHBITMAP(NULL,hBMP);

3,从句柄中找到位图结构体,位图结构体(BITMAP)包含了关于位图的所有信息

BITMAP bitmap; GetObject(hBMP,sizeof(BITMAP),&bitmap);

4,参照BITMAP结构体,就能得到你要的字节数组

bitmapbmBits;

不过得到的不一定是字节数组,因为图像有的用3个字节表示一个像素,有的是一个位标识一个像素。

摄像头时,你有枚举设备,然后获取设备吗?

保存,一般用ISampleGrabber获取缓存。

pSampleGrabber->GetConnectedMediaType(&am_media_type); //检索采集卡输入的媒体类型

VIDEOINFOHEADER pVideoInfoHeader = //数据格式

(VIDEOINFOHEADER )am_media_typepbFormat;

pSampleGrabber->SetBufferSamples(TRUE);

// 准备好buffer

long nBufferSize = am_media_typelSampleSize; //定义一个long,存放样本大小。

long pBuffer = (long )malloc(nBufferSize); //指向nBufferSize的指针pBuffer。

// 将现在显示的图像获取为静止画面

pSampleGrabber->GetCurrentBuffer(&nBufferSize,

pBuffer);

//

// 保存到Bitmap。

// 此sample为了看到截图结果,

// 将其保存为Bitmap。

//

HANDLE fh;

BITMAPFILEHEADER bmphdr; //包含的信息的类型,规模和布局的文件

DWORD nWritten; //双字节

memset(&bmphdr, 0, sizeof(bmphdr)); //设置到指定的字符缓冲区(指针的目的地,字符集,字符数)

bmphdrbfType = ('M' << 8) | 'B'; //按位或,为BM。

bmphdrbfSize = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER) + nBufferSize; //位图文件头数据(类型,大小),位图信息头数据(尺度),数据(每一个像素值。

bmphdrbfOffBits = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER); //位图数据起始位,在文件头和信息头之后。

fh = CreateFile(TEXT("resultbmp"), //创建文件名,写文件,不共享读写,缺省安全属性,如果文件存在,也创建,一般的文件,模板文件为空。

GENERIC_WRITE, 0, NULL,

CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL); //文件句柄,读写数据缓冲区,多少数据要写入,已经写入多少数据,异步读写(大多使用NULL)

WriteFile(fh, //包含的信息类型,规模和布局的文件,图像的位图的颜色和尺寸信息,显示图像获取静止画面的数据)

&pVideoInfoHeader->bmiHeader,

sizeof(BITMAPINFOHEADER), &nWritten, NULL);

WriteFile(fh, pBuffer, nBufferSize, &nWritten, NULL);

CloseHandle(fh);

free(pBuffer);

以上就是关于如何在 Qt显示内存里的图像数据全部的内容,包括:如何在 Qt显示内存里的图像数据、你如何简单地从图像获取像素数据的数组、directshow怎样获取摄像头采集到的图像数据解决办法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9610211.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存