1:Systen.AccessViolationException {"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"}
思考:指针越界,超出图像数组内存。查找图像指针变化循环,调整指针位置。
2:p[0]未将引用对象设置至实例
调试:第一轮调试循环没问题,第二轮循环出现该错误,说明中间对象引用错误,重点检查条件改变部分。
错误的赋值:Ptr =(byte*)(stride*k+3*k)会导致这个问题,byte*的*表示指针,而stride*k+3*k并没有表示特定地址,而是图像中的距离, byte* temp = (byte*)unlock.Scan0.ToPointer(); Scan0方法是指针,指向图像的首地址。可强制转化为byte*类型。
注意几点,第一: * Ptr表示指针,是图像内存位置的变化,Ptr[0]是每个图像内存的第一个byte。
第二:若指针指向错误的位置,可能出现1的错误,也可能出现2的错误。
3:若使用指针,当指针指向数据头的时候,在这一组数据里所有的位置都已经排序好,一个指针只能按照顺序逐个访问。如图像数据,使用指针获取图像头,(byte* Ptr)这个 * 就是指针,数据按照 byte的格式排列完成。图像一个像素有三个byte,每次访问一个Ptr,就得到RGB的值,即R=Ptr[0], G=Ptr[1], B=Ptr[2]。Ptr++;就表示移动一个byte的距离,即处理一个R分量。
4:数据类型的转换,在图像处理中应当特别注意,例如double类型转为int类型,或者两个不同的数据类型相乘,其结果大不相同。在0-255灰度值的图像来说,影响还是很大的。
4.1双精度型和整型相乘,返回双精度型,强制转化为整型是直接去掉小数点后的数值。
4.2全部加完双精度在强制转换的值较为接近原始值,先强制转换在相加,数值可能变小,因为小数点后的数值全被省略。