在网上搜索VC 图像处理,就出现好多关于该讲座的问题,我按照该文档中所讲的内容编写程序来显示位图,编译成功,可以运行不了,总是出现对话框说Debug Assertion Failed! 
File:viewscrl.cpp
line:220
我也不知道是怎么回事!!
   请问有没有根据这个讲座成功编写过该程序的,希望给点意见!

解决方案 »

  1.   

    调试了好久还没有结果,一直没有头绪。说的是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来的。
       有没有人知道是哪里错了呢?麻烦高人指点呀!
      

  2.   

    pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100; 
    这句不能这么写吧,写成下面的试试
    pDoc->m_sizeDoc.cx=100;
    pDoc->m_sizeDoc.cy=100;
      

  3.   

    试了好久还没有结果,一直没有头绪。说的是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; 
    ========
    既然是有条件的,你确定这个条件成立吗?如果不成立,那么这个尺寸就不会被赋值
      

  4.   

    m_hDIB在文档类中是否初始化为空了?还是没有进行初始化?
      

  5.   

    sizeTotal.cx和sizeTotal.cy都是-842150451,这肯定有问题呀!
    现在发现m_hDIB没有在文档类中初始化,应该把它初始化为空,是吧?
      

  6.   

    谢谢了!确实是没有赋处置的问题,真是非常感谢呀!现在这个问题没有了,呵呵!
       可是我的程序还是显示不出来位图,在文档类中重载了文件打开函数如下:
    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文件,就提示说图像文件打不开,麻烦你再帮我看看,是打开文件这个函数除了问题吧?非常感谢呀!
      

  7.   

    在CDibDoc::CDibDoc()中设置m_sizeDoc默认尺寸,初始化m_hDIB吧
    CMyDIPDoc::CMyDIPDoc()
    {
            m_sizeDoc.cx = 100;
    m_sizeDoc.cy = 100; m_hDIB = NULL;
           //另:调色板初始化了?//m_palDIB = NULL;?
    }
      

  8.   

    在OnDraw函数里有以下代码:
    if(pDoc->m_hDIB ==NULL)
        
    {//判断图像数据是否为空;
          AfxMessageBox("图像数据不能为空,请首先读取图像数据!");
          return;
    }
    刚刚把m_hDIB赋值为空了,现在就遇到这个问题了,在OnOpenDucument里已经对m_hDIB赋值了呀!
      

  9.   

    lpszPathName这个路径是你图片所在路径和名称吗?你要多调试一下。看看各个变量的值是否是你所需的。
      

  10.   

    你要仔细调试,m_hDIB = hDIB语句可能根本就没有执行到。调试代码是编程人员的基本功阿,你一定要掌握。
      

  11.   

    请问biao_zi,调色板应该怎么初始化呀?就把m_palDIB 设为NULL就可以吗?
      

  12.   

    谢谢  happyparrot ,确实调试很重要,我只是在编译的时候有错误的话,我还能修改修改,可是在编译成功之后,它要是在错,我就有点不知所措了,今天还是有收获的,谢谢你哦!以后我会多调试,多锻炼锻炼!呵呵
        
      

  13.   

    再请问一下哦,实在不好意思!
     这个lpszPathName这个,我应该具体制定路径的名字吗?我愿意并不是一运行就打开某个固定的图片,而是在运行后,点击打开,才选择文件来进行读取,所以就没有设这个lpszPathName的值!是不是不设置就不可以呀?如果要设置的话,所有的lpszPathName都要改成路径名?
      

  14.   

    如果是系统启动后再打开,你就不要在这个函数中加代码了。增加一个菜单项来处理就可以了。先调用CFileDialog选择图片文件,然后再进行图片处理后显示到视图就OK
      

  15.   

    哦,那我先在这个程序,就是刚开始固定打开一张图片的,是吧?那现在我应该把lpszPathName改成图片的地址,我把
    if (!file.Open(lpszPathName, CFile::modeRead  ¦ CFile::shareDenyWrite, &fe)) 这句里的lpszPathName改成了:
    if (!file.Open("E:\3.bmp", CFile::modeRead | CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
      

  16.   

    我还想问一下函数执行的先后顺序,我加了断点之后,发现它先执行的是OnDraw函数,然后就弹出那个“图像数据不能为空,请先读取图像数据”这个对话框,我发现它就没有去执行OnOpenDucument这个函数呀?这又是咋回事呢?
      我的问题也有点太多了,嘿嘿!今天是遇到好心人了!
      

  17.   

    你代码中似乎在
    ::GlobalUnlock((HGLOBAL)hDIB);
    之后又有调用了hDIB,这时是无效的了,把这句适当后移试下
      

  18.   

    if (!file.Open("E:\3.bmp", CFile::modeRead  ¦ CFile::shareDenyWrite, &fe)),可是图像还是打不开呀?怎么回事呢?
    该为if (!file.Open("E:\\3.bmp", CFile::modeRead  ¦ CFile::shareDenyWrite, &fe))
    看来你的基础还比较差哦
      

  19.   

    不要用OnOpenDucument了,这是你在系统启动后,点击菜单“文件”下的“新建”子菜单后调用的
      

  20.   

    发现有GlobalAlloc(),却没有对应的GlobalFree()
      

  21.   

    to biao_zi :
      好像是这样的,我去改掉!呵呵!人多力量大呀!
      

  22.   

    是不是在把hDIB赋值给m_hDIB之后,就可以把它释放掉了呢?
    我在::GlobalUnlock((HGLOBAL)hDIB);这句之后又调用::GlobalFree((HGLOBAL)hDIB);应该可以了吧?