OpenCV打开和显示图像

新建一单文档滚动视图AppExe。源文件链接

doc类添加变量

public:
	int ReadImage(LPCTSTR lpszPathName);
	int imageWidth,imageHeight;		//滚动视图大小
	BITMAPINFO * lpbmi;			//bmp显示缓存,必需
	IplImage* m_pImage;			//图像指针
 变量初始化 
CImageProcessDoc::CImageProcessDoc()
{
	// TODO: add one-time construction code here
	m_pImage=NULL;
	lpbmi=NULL;
	imageWidth=imageHeight=100;		//初始滚动视图大小


}
 读取图像函数,不能直接按下面代码定义ReadImage(IplImage*image,LPCTSTR lpszPathName,BITMAPINFO* lpbmi),因为局部函数产生的内存不能传递给image和lpbmi,最后image和lpbmi都是NULL,要想使用ReadImage(IplImage*image,LPCTSTR lpszPathName,BITMAPINFO* lpbmi),必需在函数外分配image和lpbmi内存大小,谨记 
不要在函数里使用new函数分配内存返回给参数,分配的内存不知道会跑到哪里! 
int CImageProcessDoc::ReadImage(LPCTSTR lpszPathName)
{
	m_pImage=cvLoadImage(lpszPathName);
	lpbmi=(LPBITMAPINFO)new char[sizeof(BITMAPINFO)+4*(1<<8)];
	
	lpbmi->bmiHeader.biBitCount=m_pImage->depth*m_pImage->nChannels;
	lpbmi->bmiHeader.biClrUsed=0;
	lpbmi->bmiHeader.biHeight=m_pImage->height;	
	lpbmi->bmiHeader.biWidth=m_pImage->width;	
	lpbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	lpbmi->bmiHeader.biSizeImage=m_pImage->width*m_pImage->height*m_pImage->nChannels;
	lpbmi->bmiHeader.biClrImportant=0;	
	lpbmi->bmiHeader.biCompression=0;	
	lpbmi->bmiHeader.biPlanes=1;//m_pImage->nChannels;		
	for(int i=0;i<(1<<8);i++)	
	{	
		RGBQUAD &o=lpbmi->bmiColors[i];
		o.rgbBlue=i;	
		o.rgbGreen=i;	
		o.rgbRed=i;	
		o.rgbReserved=0;		
	}
	return TRUE;

}
打开文件操作,因为每次打开文件都会新建一视图,并调用视图的OnInitialUpdate函数,所以并不需要添加UpdateAllViews函数(这里是单文档SDI)
BOOL CImageProcessDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	if(ReadImage(lpszPathName))
	{
		imageHeight=m_pImage->height;
		imageWidth=m_pImage->width;
	//	UpdateAllViews(NULL,0,0);
	}
	return TRUE;
}
视图初始化,设置滚动视图大小与图像大小一致,每次打开新文档自动建立视图,调用此函数
void CImageProcessView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CImageProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = pDoc->imageWidth;
	sizeTotal.cy = pDoc->imageHeight;
	SetScrollSizes(MM_TEXT, sizeTotal);
	
}
 显示图像 
void CImageProcessView::OnDraw(CDC* pDC)
{
	CImageProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if (pDoc->m_pImage!=NULL)//图像非空
	{
		StretchDIBits(pDC->m_hDC,0,0,pDoc->m_pImage->width,pDoc->m_pImage->height,
			
			0,pDoc->m_pImage->height,pDoc->m_pImage->width,-pDoc->m_pImage->height,
			
			pDoc->m_pImage->imageData,pDoc->lpbmi,
			
			DIB_RGB_COLORS,SRCCOPY);
	}

}


 

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值