解决方案 »

  1.   

    lHeight使用之前没有先给它赋值
      

  2.   

    赋值之后别的文件里又出现问题,改完之后又弹出对话框,显示’Run-Time Check Failure #3 - The variable -------‘’下面是中断,继续,还有取消这三个按钮。这是什么问题啊?
      

  3.   

    设置些断点监控下 'lHeight“变量。把出错部分代码贴上来,否则大家很难帮上忙的。
      

  4.   

    #include "stdafx.h"
    #include  "cdib.h"#include "ImageProcessing.h"
    #include "SmoothProcessDib.h"
    // SmoothProcessDib//IMPLEMENT_DYNAMIC(SmoothProcessDib, CWnd)CSmoothProcessDib::CSmoothProcessDib(CDib *pDib)
    {
    m_pDib = pDib;
    }
    CSmoothProcessDib::~CSmoothProcessDib(void)
    {
    }
    //BEGIN_MESSAGE_MAP(SmoothProcessDib, CWnd)
    //END_MESSAGE_MAP()// SmoothProcessDib 消息处理程序
    BOOL CSmoothProcessDib::Middle_Smooth( )
    {
    LPBYTE lpDst; // 指向缓存图像的指针
    LPBYTE lpNewDIBBits; // 指向缓存DIB图像的指针
    HLOCAL hNewDIBBits;
    int i,j,x,y,m; //循环变量
    int flag=1;  //循环标志变量
    BYTE pixel[9],mid; //窗口像素值及中值
    BYTE temp;//中间变量

    LONG lWidth;
    LONG  lHeight;
    LPBYTE   lpDIBBits;
    //LPBYTE lpDIBBits=m_pDib->GetData();//找到原图像的起始位置
        // LONG lWidth=m_pDib->GetWidth();    //获得灰度图像的宽度
    //LONG lHeight=m_pDib->GetHeight(); //获得灰度图像的高度  //获得原图像的高度 // 暂时分配内存,以保存新图像
    hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
    if (hNewDIBBits == NULL)
    {
    return FALSE;
    }

    lpNewDIBBits = (LPBYTE )LocalLock(hNewDIBBits); // 初始化新分配的内存,设定初始值为0
    lpDst = (LPBYTE)lpNewDIBBits;
    memset(lpDst, (BYTE)0, lWidth * lHeight);  //中值滤波
    for(j=1;j<lHeight-1;j++)
    {
    for(i=1;i<lWidth-1;i++)
    {
    //把3*3屏蔽窗口的所有像素值放入pixel[m]
    m=0;
    for(y=j-1;y<=j+1;y++)
    for(x=i-1;x<=i+1;x++)
    {
    pixel[m]=lpDIBBits[y*lWidth+x];
    m++;
    }
    //把pixel[m]中的值按降序排序
    do{
    flag=0;
    for(m=0;m<9;m++)
    {
    if(pixel[m]<pixel[m+1])
    {
    temp=pixel[m];
    pixel[m]=pixel[m+1];
    pixel[m+1]=temp;
    flag=1;
    }
    } }while(flag==1); //求中值mid
    mid=pixel[4]; // 指向目标图像第j行,第i个像素的指针
    lpDst = (LPBYTE)lpNewDIBBits + lWidth * j + i;
                //将中值赋给目标图像的当前点
                *lpDst = mid; }
    } // 复制变换后的图像
    memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
         //释放内存
    LocalUnlock(hNewDIBBits);
    LocalFree(hNewDIBBits);    return TRUE;
    }
    错误指向了这:hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
    这是中值滤波的程序
    整个程序是可以运行的,就是中值滤波这块不能显示效果!直接弹回到程序。
      

  5.   

    你的代码把上面一些屏蔽了, 所以不对, 这个逻辑很基础....//LPBYTE lpDIBBits=m_pDib->GetData();//找到原图像的起始位置
        // LONG lWidth=m_pDib->GetWidth();    //获得灰度图像的宽度
    //LONG lHeight=m_pDib->GetHeight(); //获得灰度图像的高度  //获得原图像的高度