在网上搜索VC 图像处理,就出现好多关于该讲座的问题,我按照该文档中所讲的内容编写程序来显示位图,编译成功,可以运行不了,总是出现对话框说Debug Assertion Failed!
File:viewscrl.cpp
line:220
我也不知道是怎么回事!!
请问有没有根据这个讲座成功编写过该程序的,希望给点意见!
File:viewscrl.cpp
line:220
我也不知道是怎么回事!!
请问有没有根据这个讲座成功编写过该程序的,希望给点意见!
line: 220 ASSERT(sizeTotal.cx >= 0 && sizeTotal.cy >= 0);
line: 250 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
line: 612 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
line: 138 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);在网上查的说viewscrl.cpp这个文件出错一般都是初始化没有定义好,比如带滚动条的窗口初始化。我正好是用了这个,但是我初始化了呀,初始化代码如下:
void CDibView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CDibDoc *pDoc=GetDocument();
if(pDoc->m_hDIB==NULL)//如果位图数据为空,设置m_sizeDoc的默认尺寸;
pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100;
SetScrollSizes(MM_TEXT,pDoc-> m_sizeDoc);
}
其中:CDibView是继承CScrollView来的。
有没有人知道是哪里错了呢?麻烦高人指点呀!
这句不能这么写吧,写成下面的试试
pDoc->m_sizeDoc.cx=100;
pDoc->m_sizeDoc.cy=100;
line: 220 ASSERT(sizeTotal.cx >= 0 && sizeTotal.cy >= 0);
line: 250 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
line: 612 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
line: 138 ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);
========
你在viewscrl.cpp中增加断点,当出现断言错误时,你看看这个sizeTotal的值是多少?if(pDoc->m_hDIB==NULL)//如果位图数据为空,设置m_sizeDoc的默认尺寸;
pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100;
========
既然是有条件的,你确定这个条件成立吗?如果不成立,那么这个尺寸就不会被赋值
现在发现m_hDIB没有在文档类中初始化,应该把它初始化为空,是吧?
可是我的程序还是显示不出来位图,在文档类中重载了文件打开函数如下:
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
LOGPALETTE *pPal;//定义逻辑调色板指针;
pPal=new LOGPALETTE;//初始化该指针;
CFile file;
CFileException fe;
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{//以"读"的方式打开文件;
AfxMessageBox("图像文件打不开!");
return FALSE;
}
DeleteContents();//删除文挡;
BeginWaitCursor(); BITMAPFILEHEADER bmfHeader;//定义位图文件头结构;
LPBITMAPINFO lpbmi;//位图信息 由颜色表和位图信息头组成
DWORD dwBitsSize;
HANDLE hDIB;
LPSTR pDIB;//指向位图数据的指针;
BITMAPINFOHEADER *bmhdr;//指向位图信息头结构的指针
dwBitsSize = file.GetLength();//得到文件长度
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=sizeof(bmfHeader))
return FALSE;//读取位图文件的文件头结构信息; if (bmfHeader.bfType != 0x4d42) //检查该文件是否为BMP格式的文件;
return FALSE; hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);//为读取图像文件数据申请缓冲区
if (hDIB == 0)
{
return FALSE;
} pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); //得到申请的缓冲区的指针;
if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
::GlobalUnlock((HGLOBAL)hDIB);
hDIB=NULL;
return FALSE;
}//此时pDIB数据块中读取的数据包括位图头信息、位图颜色表、图像像素的灰度值;
bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针赋值;
::GlobalUnlock((HGLOBAL)hDIB); if ((*bmhdr).biBitCount!=8)//验证是否为8bit位图
{
AfxMessageBox("该文件不是灰度位图格式!");
return FALSE;
} m_hDIB=hDIB;//将内部变量数据赋于全局变量; //下面是记录位图的尺寸;
m_sizeDoc.cx=bmhdr->biWidth;
m_sizeDoc.cy=bmhdr->biHeight; //下面是根据颜色表生成调色板;
m_palDIB=new CPalette;
pPal->palVersion=0x300;//填充逻辑颜色表
pPal->palNumEntries=256;
lpbmi=(LPBITMAPINFO)bmhdr; for(int i=0;i<256;i++)
{//每个颜色表项的R、G、B值相等,并且各个值从"0"到"255"序列展开;
pPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;
pPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;
pPal->palPalEntry[i].peBlue= lpbmi->bmiColors[i].rgbBlue;;
pPal->palPalEntry[i].peFlags=0;
} m_palDIB->CreatePalette(pPal);
//根据读入的数据得到位图的宽、高、颜色表;
if(pPal)
delete pPal; EndWaitCursor();
SetPathName(lpszPathName);//设置存储路径
SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE
return TRUE;
}后面的应该没问题,现在问题是运行程序后,它就自己弹出一个对话框说:图像数据不能为空,请先读取数据。我点确定之后,打开一个.bmp文件,就提示说图像文件打不开,麻烦你再帮我看看,是打开文件这个函数除了问题吧?非常感谢呀!
CMyDIPDoc::CMyDIPDoc()
{
m_sizeDoc.cx = 100;
m_sizeDoc.cy = 100; m_hDIB = NULL;
//另:调色板初始化了?//m_palDIB = NULL;?
}
if(pDoc->m_hDIB ==NULL)
{//判断图像数据是否为空;
AfxMessageBox("图像数据不能为空,请首先读取图像数据!");
return;
}
刚刚把m_hDIB赋值为空了,现在就遇到这个问题了,在OnOpenDucument里已经对m_hDIB赋值了呀!
这个lpszPathName这个,我应该具体制定路径的名字吗?我愿意并不是一运行就打开某个固定的图片,而是在运行后,点击打开,才选择文件来进行读取,所以就没有设这个lpszPathName的值!是不是不设置就不可以呀?如果要设置的话,所有的lpszPathName都要改成路径名?
if (!file.Open(lpszPathName, CFile::modeRead ¦ CFile::shareDenyWrite, &fe)) 这句里的lpszPathName改成了:
if (!file.Open("E:\3.bmp", CFile::modeRead | CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
我的问题也有点太多了,嘿嘿!今天是遇到好心人了!
::GlobalUnlock((HGLOBAL)hDIB);
之后又有调用了hDIB,这时是无效的了,把这句适当后移试下
该为if (!file.Open("E:\\3.bmp", CFile::modeRead ¦ CFile::shareDenyWrite, &fe))
看来你的基础还比较差哦
好像是这样的,我去改掉!呵呵!人多力量大呀!
我在::GlobalUnlock((HGLOBAL)hDIB);这句之后又调用::GlobalFree((HGLOBAL)hDIB);应该可以了吧?