一:m_hBitmap != 0这个Bug困扰我甚久,无意之中不知何故就被解决了。
重新整理代码时发现该异常的原因:
1:文件读取路径错误
2:Cimage 创建成全局对象时,读取一次后就不能再次读取,否则就会异常。
个人理解:应该是读取一次后CImage对象地址改变,当再次赋值时地址不在是起始位置,因此出现m_hBitmap != 0,无法再次创建头文件(图像格式定义段)。
解决方法:1、修改读取文件地址,注意带上正确的文件格式。
2、创建局部变量,每次运行到局部变量时都会自动更新CImage类,从文件头开始处理,不会出现此类异常
但是这个错误,给我太多的警示了。
1:C++语言对指针的管理要求很严格,在使用完成后一定要删除相应的指针,避免野指针的出现。
2:遇到问题先思考,不要第一步就先找问题的解决方案,切记根据现有的条件去思考问题的源头,如何解决,理清思路后,验证解决问题。实在解决不了的在动手查找答案,看答案也要带着问题去,这个问题的解决思路有哪些,看清楚,理解之后自己 在验证问题的解决方案。
3:可通过stackoverflow、MSDN、优快云、GitHub等寻找解决方案。
CImage类,若第一次用完之后没有及时销毁指针,会导致野指针的问题,当第二次在创建类时就会出现问题。
CImage image;
image.load("E:\\DATA.JPG"); //加载图像
//image.create(width,height,channel,alpha); //创建图像文件
BYTE* ptr = (BYTE*)image.GetsBits(); //获取图像文件头指针‘’
int channel = image.GetBpp(); // 获取图像通道数
int pitch =image.GetPitch(); //获取图像行距,正负决定图像头是从上还是从下开始读取
BYTE* buffer = new BYTE[m_nheight * m_nwidth]; //保存的图像数据初始化
//按行拷贝m_ptr指针下的数据区域到数组
for (int i = 0; i < m_nheight; ++i)
memcpy(buffer + i * m_nwidth,m_ptr + i * (m_Image.GetPitch()) ,m_nwidth);//注意此处的pictch要带符号
//保存数组到图像操作
BYTE* data = (BYTE*)outImage.GetBits();
for (int Y = 0; Y < m_nheight; Y++)
{
for (int X = 0; X<m_nwidth ; X++)
{
//地址操作符
*(data + pitch * Y + X) = (int)buffer[X + Y * m_nwidth];
}
}
outImage.Save(savepath);