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