将openCV中的IplImage格式的图片显示到Picture控件上

本文介绍了使用OpenCV库中的两种不同方法将图像显示在Windows窗口中的实现细节。第一种方法通过填充位图信息并利用StretchDIBits函数完成图像显示,适用于8位、24位及32位图像。第二种方法尝试使用自定义类CvvImage来实现图像绘制,但未成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    我在网上查到了两种方法,第一种方法成功了,但是第二种方法没有成功,期待有人能把它改试成功。

   方法一:

ExpandedBlockStart.gif代码
 1 IplImage *img = cvLoadImage("****");
 2 BITMAPINFO bmi;
 3 FillBitmapInfo(&bmi, img->width, img->height, img->depth*img->nChannels);
 4 ShowImage(img, wnd, bmi); // 这里的wnd是目标窗口,必须是CWnd类型的。
 5 
 6 void FillBitmapInfo( BITMAPINFO *bmi, int width, int height, int bpp )
 7 {
 8     ASSERT( bmi && width > 0 && height > 0 &&
 9         (bpp == 8 || bpp == 24 || bpp == 32) );BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);memset( bmih, 0sizeof(*bmih));
10     bmih->biSize   = sizeof(BITMAPINFOHEADER);
11     bmih->biWidth = width;
12     bmih->biHeight = -abs(height);
13     bmih->biPlanes = 1;
14     bmih->biBitCount = bpp;
15     bmih->biCompression = BI_RGB;if( bpp == 8 )
16     {
17         RGBQUAD* palette = bmi->bmiColors;
18         int i;
19         for( i = 0; i < 256; i++ )
20         {
21             palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
22             palette[i].rgbReserved = 0;
23         }
24     }
25 }
26 
27 void CQRDlg::ShowImage(IplImage *pImg, CWnd *wnd, BITMAPINFO &bmi)
28 {
29     CDC *pDC = wnd->GetDC();
30     HDC hDC = pDC->GetSafeHdc();
31     CRect rect;
32     wnd->GetClientRect(&rect);
33     if(bmi.bmiHeader.biBitCount== 8)
34     {
35         CPalette pal;
36         HPALETTE hpal=NULL;
37         HPALETTE hOldPal=NULL;
38         ::SetPaletteEntries(hpal,0,256,(LPPALETTEENTRY)bmi.bmiColors);
39         hOldPal = ::SelectPalette(pDC->GetSafeHdc(), hpal, TRUE);
40     }
41     ::SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);
42     ::StretchDIBits(pDC->GetSafeHdc(),rect.left,rect.top,rect.Width(),rect.Height(),0,0,
43         pImg->width,pImg->height,pImg->imageData,&bmi,DIB_RGB_COLORS,SRCCOPY); 
44     
45 }

    方法二:

ExpandedBlockStart.gif代码
 1 // 用于在控件 ID上显示图片 img
 2 void CTestDlg::DrawPicToHDC(IplImage *img, UINT ID)
 3 {
 4  CDC *pDC = GetDlgItem(ID)->GetDC();
 5  HDC hDC=  pDC->GetSafeHdc();
 6 
 7  CRect rect;
 8  GetDlgItem(ID)->GetClientRect(&rect);
 9  // 求出图片空间的位置
10  int rw = rect.left;
11  int rh = rect.top;
12  // 求出图片的宽和高
13  int iw = img->width;
14  int ih = img->height;
15  SetRect(rect,rw,rh,rw+iw,rh+ih);
16 
17  CvvImage cimg;
18  cimg.CopyOf(img);
19  cimg.DrawToHDC(hDC,&rect);
20 
21  ReleaseDC(pDC);
22 }
23 

 

转载于:https://www.cnblogs.com/tibetanmastiff/archive/2010/07/13/1776776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值