首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于VC数字图像处理编程讲座问题 [已结帖,结帖人:xianzi123]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-05-10 10:01:07 楼主
    在网上搜索VC 图像处理,就出现好多关于该讲座的问题,我按照该文档中所讲的内容编写程序来显示位图,编译成功,可以运行不了,总是出现对话框说Debug Assertion Failed!
    File:viewscrl.cpp
    line:220
    我也不知道是怎么回事!!
      请问有没有根据这个讲座成功编写过该程序的,希望给点意见!
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      9

    发表于:2008-05-10 10:13:221楼 得分:0
    没看过,不过你可以学会自己调试排错。用调试运行的方式,在出错的时候中断看堆栈,定位到你自己的代码行,看是哪一句出错。问问题的时候最好贴出相关代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 10:25:372楼 得分:0
    代码好多的呀!
    要不我给你发过去,你帮我看看可以不?非常感谢!
    如果调试运行的话,怎么在堆栈中定位到自己的代码行呀?刚入门VC不久,还没调试过!呵呵!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qqwangbalu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 10:26:293楼 得分:0
    设断点单步调试!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 10:30:164楼 得分:0
    好的,那我先试试吧!谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 17:51:575楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 18:33:036楼 得分:0
    pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100;
    这句不能这么写吧,写成下面的试试
    pDoc->m_sizeDoc.cx=100;
    pDoc->m_sizeDoc.cy=100;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-10 18:38:077楼 得分:0
    改了,可是没有一点影响,还是老地方出错!怎么办呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 09:41:238楼 得分:0
    还有没有人知道呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 09:45:259楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 09:45:5910楼 得分:10
    m_hDIB在文档类中是否初始化为空了?还是没有进行初始化?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 09:53:1411楼 得分:0
    sizeTotal.cx和sizeTotal.cy都是-842150451,这肯定有问题呀!
    现在发现m_hDIB没有在文档类中初始化,应该把它初始化为空,是吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 09:54:0112楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:04:1313楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:04:4214楼 得分:5
    在CDibDoc::CDibDoc()中设置m_sizeDoc默认尺寸,初始化m_hDIB吧
    CMyDIPDoc::CMyDIPDoc()
    {
            m_sizeDoc.cx = 100;
    m_sizeDoc.cy = 100;

    m_hDIB = NULL;
          //另:调色板初始化了?//m_palDIB = NULL;?
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:05:2515楼 得分:0
    主要是前面几行,后面的都是打开文件之后的处理,应该看前面的那些就可以了!嘿嘿!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:09:2616楼 得分:0
    在OnDraw函数里有以下代码:
    if(pDoc->m_hDIB ==NULL)
       
    {//判断图像数据是否为空;
          AfxMessageBox("图像数据不能为空,请首先读取图像数据!");
          return;
    }
    刚刚把m_hDIB赋值为空了,现在就遇到这个问题了,在OnOpenDucument里已经对m_hDIB赋值了呀!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:09:4617楼 得分:15
    lpszPathName这个路径是你图片所在路径和名称吗?你要多调试一下。看看各个变量的值是否是你所需的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:11:1318楼 得分:0
    你要仔细调试,m_hDIB = hDIB语句可能根本就没有执行到。调试代码是编程人员的基本功阿,你一定要掌握。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:11:1819楼 得分:0
    请问biao_zi,调色板应该怎么初始化呀?就把m_palDIB 设为NULL就可以吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:14:3120楼 得分:0
    谢谢  happyparrot ,确实调试很重要,我只是在编译的时候有错误的话,我还能修改修改,可是在编译成功之后,它要是在错,我就有点不知所措了,今天还是有收获的,谢谢你哦!以后我会多调试,多锻炼锻炼!呵呵
       
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:16:0521楼 得分:0
    调试也是很简单的事。你这个只需进行很基本的调试就可以判断了。加上断点后,看一下各个变量的值是否是你预想的值就行了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:19:0122楼 得分:0
    再请问一下哦,实在不好意思!
    这个lpszPathName这个,我应该具体制定路径的名字吗?我愿意并不是一运行就打开某个固定的图片,而是在运行后,点击打开,才选择文件来进行读取,所以就没有设这个lpszPathName的值!是不是不设置就不可以呀?如果要设置的话,所有的lpszPathName都要改成路径名?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:22:5823楼 得分:0
    如果是系统启动后再打开,你就不要在这个函数中加代码了。增加一个菜单项来处理就可以了。先调用CFileDialog选择图片文件,然后再进行图片处理后显示到视图就OK
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:26:1424楼 得分:0
    哦,那我先在这个程序,就是刚开始固定打开一张图片的,是吧?那现在我应该把lpszPathName改成图片的地址,我把
    if (!file.Open(lpszPathName, CFile::modeRead  ¦ CFile::shareDenyWrite, &fe)) 这句里的lpszPathName改成了:
    if (!file.Open("E:\3.bmp", CFile::modeRead | CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:30:1925楼 得分:0
    我还想问一下函数执行的先后顺序,我加了断点之后,发现它先执行的是OnDraw函数,然后就弹出那个“图像数据不能为空,请先读取图像数据”这个对话框,我发现它就没有去执行OnOpenDucument这个函数呀?这又是咋回事呢?
      我的问题也有点太多了,嘿嘿!今天是遇到好心人了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • biao_zi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:33:2826楼 得分:0
    你代码中似乎在
    ::GlobalUnlock((HGLOBAL)hDIB);
    之后又有调用了hDIB,这时是无效的了,把这句适当后移试下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:36:1227楼 得分:0
    if (!file.Open("E:\3.bmp", CFile::modeRead  ¦ CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
    该为if (!file.Open("E:\\3.bmp", CFile::modeRead  ¦ CFile::shareDenyWrite, &fe))
    看来你的基础还比较差哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:37:3428楼 得分:0
    不要用OnOpenDucument了,这是你在系统启动后,点击菜单“文件”下的“新建”子菜单后调用的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:40:4329楼 得分:0
    嘿嘿,我的基础是比较差了!都还没有自己编写过程序,接触VC也没有很久,哎!不知啥时候才能学好它呀!
    看来我的基础太差,我现在先自己调试调试,等实在不会的时候,我再找你,好不好?呵呵!今天真是谢了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • happyparrot
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-05-11 10:41:4630楼 得分:0
    嗯。先揭帖吧。哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • biao_zi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:43:2131楼 得分:0
    发现有GlobalAlloc(),却没有对应的GlobalFree()
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:45:0732楼 得分:0
    to biao_zi :
      好像是这样的,我去改掉!呵呵!人多力量大呀!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:50:5533楼 得分:0
    是不是在把hDIB赋值给m_hDIB之后,就可以把它释放掉了呢?
    我在::GlobalUnlock((HGLOBAL)hDIB);这句之后又调用::GlobalFree((HGLOBAL)hDIB);应该可以了吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianzi123
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-11 10:51:3334楼 得分:0
    等下这个问题弄完了,我就结贴,呵呵!不要着急哦!
    修改 删除 举报 引用 回复