首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
VC/MFC
图形处理/算法
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
关于VC数字图像处理编程讲座问题
[已结帖,结帖人:xianzi123]
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
结帖率:
86.96%
发表于:
2008-05-10 10:01:07
楼主
在网上搜索VC 图像处理,就出现好多关于该讲座的问题,我按照该文档中所讲的内容编写程序来显示位图,编译成功,可以运行不了,总是出现对话框说Debug Assertion Failed!
File:viewscrl.cpp
line:220
我也不知道是怎么回事!!
请问有没有根据这个讲座成功编写过该程序的,希望给点意见!
问题点数:
50
回复次数:
34
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Mackz
在相互
等级:
可用分等级:
小地主
总技术分:
144365
总技术分排名:
26
4
6
9
发表于:
2008-05-10 10:13:22
1
楼 得分:
0
没看过,不过你可以学会自己调试排错。用调试运行的方式,在出错的时候中断看堆栈,定位到你自己的代码行,看是哪一句出错。问问题的时候最好贴出相关代码。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-10 10:25:37
2
楼 得分:
0
代码好多的呀!
要不我给你发过去,你帮我看看可以不?非常感谢!
如果调试运行的话,怎么在堆栈中定位到自己的代码行呀?刚入门VC不久,还没调试过!呵呵!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qqwangbalu
飞天舞
等级:
可用分等级:
富农
总技术分:
1699
总技术分排名:
12844
发表于:
2008-05-10 10:26:29
3
楼 得分:
0
设断点单步调试!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-10 10:30:16
4
楼 得分:
0
好的,那我先试试吧!谢谢
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-10 17:51:57
5
楼 得分:
0
调试了好久还没有结果,一直没有头绪。说的是viewscrl.cpp 的错误,错误代码主要为:
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来的。
有没有人知道是哪里错了呢?麻烦高人指点呀!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
biao_zi
等级:
可用分等级:
中农
总技术分:
256
总技术分排名:
53696
发表于:
2008-05-10 18:33:03
6
楼 得分:
0
pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100;
这句不能这么写吧,写成下面的试试
pDoc->m_sizeDoc.cx=100;
pDoc->m_sizeDoc.cy=100;
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-10 18:38:07
7
楼 得分:
0
改了,可是没有一点影响,还是老地方出错!怎么办呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 09:41:23
8
楼 得分:
0
还有没有人知道呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 09:45:25
9
楼 得分:
20
试了好久还没有结果,一直没有头绪。说的是viewscrl.cpp 的错误,错误代码主要为:
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;
========
既然是有条件的,你确定这个条件成立吗?如果不成立,那么这个尺寸就不会被赋值
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 09:45:59
10
楼 得分:
10
m_hDIB在文档类中是否初始化为空了?还是没有进行初始化?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 09:53:14
11
楼 得分:
0
sizeTotal.cx和sizeTotal.cy都是-842150451,这肯定有问题呀!
现在发现m_hDIB没有在文档类中初始化,应该把它初始化为空,是吧?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 09:54:01
12
楼 得分:
0
对
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:04:13
13
楼 得分:
0
谢谢了!确实是没有赋处置的问题,真是非常感谢呀!现在这个问题没有了,呵呵!
可是我的程序还是显示不出来位图,在文档类中重载了文件打开函数如下:
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文件,就提示说图像文件打不开,麻烦你再帮我看看,是打开文件这个函数除了问题吧?非常感谢呀!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
biao_zi
等级:
可用分等级:
中农
总技术分:
256
总技术分排名:
53696
发表于:
2008-05-11 10:04:42
14
楼 得分:
5
在CDibDoc::CDibDoc()中设置m_sizeDoc默认尺寸,初始化m_hDIB吧
CMyDIPDoc::CMyDIPDoc()
{
m_sizeDoc.cx = 100;
m_sizeDoc.cy = 100;
m_hDIB = NULL;
//另:调色板初始化了?//m_palDIB = NULL;?
}
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:05:25
15
楼 得分:
0
主要是前面几行,后面的都是打开文件之后的处理,应该看前面的那些就可以了!嘿嘿!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:09:26
16
楼 得分:
0
在OnDraw函数里有以下代码:
if(pDoc->m_hDIB ==NULL)
{//判断图像数据是否为空;
AfxMessageBox("图像数据不能为空,请首先读取图像数据!");
return;
}
刚刚把m_hDIB赋值为空了,现在就遇到这个问题了,在OnOpenDucument里已经对m_hDIB赋值了呀!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:09:46
17
楼 得分:
15
lpszPathName这个路径是你图片所在路径和名称吗?你要多调试一下。看看各个变量的值是否是你所需的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:11:13
18
楼 得分:
0
你要仔细调试,m_hDIB = hDIB语句可能根本就没有执行到。调试代码是编程人员的基本功阿,你一定要掌握。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:11:18
19
楼 得分:
0
请问biao_zi,调色板应该怎么初始化呀?就把m_palDIB 设为NULL就可以吗?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:14:31
20
楼 得分:
0
谢谢 happyparrot ,确实调试很重要,我只是在编译的时候有错误的话,我还能修改修改,可是在编译成功之后,它要是在错,我就有点不知所措了,今天还是有收获的,谢谢你哦!以后我会多调试,多锻炼锻炼!呵呵
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:16:05
21
楼 得分:
0
调试也是很简单的事。你这个只需进行很基本的调试就可以判断了。加上断点后,看一下各个变量的值是否是你预想的值就行了。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:19:01
22
楼 得分:
0
再请问一下哦,实在不好意思!
这个lpszPathName这个,我应该具体制定路径的名字吗?我愿意并不是一运行就打开某个固定的图片,而是在运行后,点击打开,才选择文件来进行读取,所以就没有设这个lpszPathName的值!是不是不设置就不可以呀?如果要设置的话,所有的lpszPathName都要改成路径名?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:22:58
23
楼 得分:
0
如果是系统启动后再打开,你就不要在这个函数中加代码了。增加一个菜单项来处理就可以了。先调用CFileDialog选择图片文件,然后再进行图片处理后显示到视图就OK
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:26:14
24
楼 得分:
0
哦,那我先在这个程序,就是刚开始固定打开一张图片的,是吧?那现在我应该把lpszPathName改成图片的地址,我把
if (!file.Open(lpszPathName, CFile::modeRead ¦ CFile::shareDenyWrite, &fe)) 这句里的lpszPathName改成了:
if (!file.Open("E:\3.bmp", CFile::modeRead | CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:30:19
25
楼 得分:
0
我还想问一下函数执行的先后顺序,我加了断点之后,发现它先执行的是OnDraw函数,然后就弹出那个“图像数据不能为空,请先读取图像数据”这个对话框,我发现它就没有去执行OnOpenDucument这个函数呀?这又是咋回事呢?
我的问题也有点太多了,嘿嘿!今天是遇到好心人了!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
biao_zi
等级:
可用分等级:
中农
总技术分:
256
总技术分排名:
53696
发表于:
2008-05-11 10:33:28
26
楼 得分:
0
你代码中似乎在
::GlobalUnlock((HGLOBAL)hDIB);
之后又有调用了hDIB,这时是无效的了,把这句适当后移试下
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:36:12
27
楼 得分:
0
if (!file.Open("E:\3.bmp", CFile::modeRead ¦ CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
该为if (!file.Open("E:\\3.bmp", CFile::modeRead ¦ CFile::shareDenyWrite, &fe))
看来你的基础还比较差哦
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:37:34
28
楼 得分:
0
不要用OnOpenDucument了,这是你在系统启动后,点击菜单“文件”下的“新建”子菜单后调用的
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:40:43
29
楼 得分:
0
嘿嘿,我的基础是比较差了!都还没有自己编写过程序,接触VC也没有很久,哎!不知啥时候才能学好它呀!
看来我的基础太差,我现在先自己调试调试,等实在不会的时候,我再找你,好不好?呵呵!今天真是谢了!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
happyparrot
快乐鹦鹉
等级:
可用分等级:
富农
总技术分:
105153
总技术分排名:
49
2
3
发表于:
2008-05-11 10:41:46
30
楼 得分:
0
嗯。先揭帖吧。哈哈
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
biao_zi
等级:
可用分等级:
中农
总技术分:
256
总技术分排名:
53696
发表于:
2008-05-11 10:43:21
31
楼 得分:
0
发现有GlobalAlloc(),却没有对应的GlobalFree()
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:45:07
32
楼 得分:
0
to biao_zi :
好像是这样的,我去改掉!呵呵!人多力量大呀!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:50:55
33
楼 得分:
0
是不是在把hDIB赋值给m_hDIB之后,就可以把它释放掉了呢?
我在::GlobalUnlock((HGLOBAL)hDIB);这句之后又调用::GlobalFree((HGLOBAL)hDIB);应该可以了吧?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xianzi123
xianzi
等级:
可用分等级:
贫农
总技术分:
0
总技术分排名:
336041
发表于:
2008-05-11 10:51:33
34
楼 得分:
0
等下这个问题弄完了,我就结贴,呵呵!不要着急哦!
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
abc推荐给好友