本文章是针对VC++处理图像的相关问题
本人建了一个多文档的MFC,自己编写了一个消息响应函数,当点击菜单的一个自添加的选项后,进行一些计算并显示结果。
//其中自己定义了一个CImg类,里面定义了bmp图像的相关操作,比如读取一幅位图,获得相应位置的RGB像素值、灰度值等
//CImg m_bmp;
//以下为逐步遍历获得图像的每个位置的灰度值
(这是我修改后的正确程序,注意我标红色的部分)
int nheight=m_bmp.GetHeight();
int nwidth=m_bmp.GetWidthPixel();
if(m_bmp.IsValidate())
{
for(int i=0;i<nheight;i++)
{ for(int j=0;j<nwidth;j++)
{
if(m_bmp.GetGray(j,i)...//刚开始的代码这一句是if(m_bmp.GetGray(i,j)....
编译的时候没有问题当点击选项后,过一会就自动终止了程序的运行。消息响应计算函数的部分代码如下:
后来编译发现弹出这个错误unhandle exception 0xc0000005 in XXX.exe:access violation
在网上搜了一下说是指针溢出或指向了非定义的非法空间,我回头看了自己的整个程序,特别是指针分配空间那一部分,再加上搜集一些关于位图操作的资料,
发现确实是因为指针指向有问题。
在这里对于广大初学VC++图像处理的同学提醒一下:
对于自定义的位图类中定义的一些像素存取的方法,比如GetGray,GetPixel,SetPixel等要求的参数x,y分别为像素的横纵坐标,而横坐标对应图像的列索引j,纵坐标对应图像的行索引i,因此在逐行遍历图像的程序段中调用方式应为SetPixel(j,,...).
所以上面的代码i,j的顺序要注意