我用单文档下,菜单驱动的方式,编写了sobel边缘检测的 程序,执行时大约到i=60处,程序显示出现问题需要关闭,我把数据读出后,做了变换,然后把负值变为绝对值,把大于255的变为255,是不是需要特殊规定。源代码如下:
CDC *pDC=(this)->GetDC( );
  
int width=m_dib.GetWidth( );
   int height=m_dib.GetHeight( );
     
  m_Data1=new int[width*height*sizeof(int)];     
  m_Data2=new int[width*height*sizeof(int)];
  m_Data3=new int[width*height*sizeof(int)];
  
  m_rData1=new int[width*height*sizeof(int)];
  m_rData2=new int[width*height*sizeof(int)];
  m_rData3=new int[width*height*sizeof(int)];

if(!m_Data1||!m_Data2||!m_Data3)
{
AfxMessageBox("内存不够");
return;
}

if(!m_rData1||!m_rData2||!m_rData3)
{
AfxMessageBox("内存不够");
return;
}
int i,j;
for(i=0;i<width;i++)
{
for(j=0;j<height;j++)
{
COLORREF color=pDC->GetPixel(i,j);
int r=GetRValue(color);
int g=GetGValue(color);
int b=GetBValue(color);

*(m_Data1+i*height+j)=r;
*(m_Data2+i*height+j)=g;
*(m_Data3+i*height+j)=b;
            
   
}
}
    
int laplace[9]={-1,-1,-1,-1,8,-1,-1,-1,-1,};
for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int value1=0;
int value2=0;
int value3=0; value1=(*(m_Data1+(i-1)*height+(j-1)))*(-1)
+(*(m_Data1+(i)*height+j-1))*(-2)+
(*(m_Data1+(i+1)*height+(j-1)))*(-1)
+(*(m_Data1+(i-1)*height+(j+1)))*(1)+
(*(m_Data1+(i)*height+j+1))*(2)+
                  (*(m_Data1+(i+1)*height+(j+1)))*(1);                
value2=(*(m_Data2+(i-1)*height+(j-1)))*(-1)
+(*(m_Data2+(i)*height+j-1))*(-2)+
(*(m_Data2+(i+1)*height+(j-1)))*(-1)+
(*(m_Data2+(i-1)*height+(j+1)))*(1)+
(*(m_Data2+(i)*height+j+1))*(2)+
                  (*(m_Data2+(i+1)*height+(j+1)))*(1);
                 

value3=(*(m_Data3+(i-1)*height+(j-1)))*(-1)
+(*(m_Data3+(i)*height+j-1))*(-2)+
(*(m_Data3+(i+1)*height+(j-1)))*(-1)+
(*(m_Data3+(i-1)*height+(j+1)))*(1)+
(*(m_Data3+(i)*height+j+1))*(2)+
                  (*(m_Data3+(i+1)*height+(j+1)))*(1);

   *(m_rData1+i*width+j)= abs(value1);
   *(m_rData2+i*width+j)=abs(value2);
   *(m_rData3+i*width+j)=abs(value3);    
              /* CString str;
 str.Format("%d,%d,%d",*(m_rData1+i*width+j),*(m_rData2+i*width+j),*(m_rData3+i*width+j));
 AfxMessageBox(str);*/

} for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++)
{
int r,g,b;
r=*(m_rData1+i*width+j);
g=*(m_rData2+i*width+j);
b=*(m_rData3+i*width+j);
CDC *pDC=(this)->GetDC();
            if(r>255) r=255; if(g>255) g=255; if(b>255) b=255;

/* CString str;
 str.Format("%d,%d,%d",r,g,b);
 AfxMessageBox(str);*/
pDC->SetPixel(i,j,RGB(r,g,b));