新建一单文档滚动视图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); } }