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