VC6.0 MFC 图像打开显示 提示


VC6。0


在 doc 的构造函数中 初始化两个变量:

         m_pImage    = NULL; // 用来存储原图像的副本
         m_pImageSrc = NULL;//用来存储原图像




//**************************************打开图像************************************//





BOOL CVDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	// TODO: Add your specialized creation code here
		m_sCurrFile  = lpszPathName;


	if( (m_pImageSrc = cvLoadImage(lpszPathName, 1)) == NULL)
		return FALSE;


	Load();




	return TRUE;
}


void CVDoc::Load()
{
 if(m_pImage != NULL)
	{
		cvReleaseImage(&m_pImage);
	}
	m_pImageSrc = cvLoadImage(m_sCurrFile, 1);
	m_pImage	= cvLoadImage(m_sCurrFile, 1);


	CRect rect;
	CFrameWnd   *pFrame=(CFrameWnd*)AfxGetMainWnd();   
	pFrame->GetActiveView()->GetClientRect(&rect);
	
	float y = (float)rect.Height()  / m_pImageSrc->height;
	float x = (float)rect.Width()   / m_pImageSrc->width;


	float ratio = x < y ? x: y;


	if(ratio < 1)
	{
		ZoomEx(ratio, m_pImageSrc, &m_pImage);
	}


	int r = ratio > 1 ? 100 : (int)(ratio*100);
}




//**************************************保存图像************************************//


//保存图像
bool CVDoc::SaveImage(CString path)
{
	if(m_pImage == NULL)
	{
		return false;
	}

	cvSaveImage(path, m_pImage);
	return true;
}




在View的构造函数中调用 InitImage(); 进行初始化

ex:

void CVView::InitImage()
{
	m_iImgX = 0;
	m_iImgY = 0;
	m_bIsExceedX = false;
	m_bIsExceedY = false;
	m_bIsChange	 = false;
	m_iPreX = -1;
	m_iPreY = -1;

}



/////////////////////////////////////////////////////////////////////////////
// CVView drawing

void CVView::OnDraw(CDC* pDC)
{
	CVDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(pDoc->m_pImage != NULL)
	{
		CvvImage img;
		img.CopyOf(pDoc->m_pImage);					//取得图像

		int x = 0, y = 0;
		CRect rect;
		GetClientRect(&rect);

		if(img.Width() < rect.Width())				//将图像摆放在视图中央
		{
			x = rect.Width() - img.Width();
			x = x / 2;
		}

		if(img.Height() < rect.Height())
		{
			y = rect.Height() - img.Height();
			y = y / 2;
		}
													//显示
		img.Show(pDC->m_hDC, x, y, pDoc->m_pImage->width, pDoc->m_pImage->height, m_iImgX, m_iImgY);
	}
}


当我们的控件不是那么大,也就是说要显示的图像 > 控件的尺寸 的时候,可以使用CvvImage 的  DrawTOHDC函数:

CvvImage::DrawToHDC


void CImage::DrawToHDC(HDC hDCDst, RECT* pDstRect);
绘制图像的ROI区域到DC的pDstRect,如果图像大小和pDstRect不一致,图像会拉伸/压缩。此函数仅在Windows下有效。


hDCDst 设备描述符。
pDstRect 对应的设备描述符区域。

ex:

                CRect    rect;
SetRect( rect, 0, 0, outputRect.Width(),outputRect.Height() );   
        m_cvImage->DrawToHDC(GetDlgItem(IDC_ORIGIN_PIC)->GetDC()->GetSafeHdc(),&rect);                                                                                                                                             //IDC_ORIGIN_PIC 是picture控件的ID




你可能感兴趣的:(windows,null,存储,mfc,Path,float)