图像指针处理调试常见的问题

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全部加完双精度在强制转换的值较为接近原始值,先强制转换在相加,数值可能变小,因为小数点后的数值全被省略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值