[英]Access violation Exception in C#
我正在使用C#进行图像处理项目。 我正在使用OTSU阈值化方法。 我收到此异常“ 试图读取或写入受保护的内存。这通常表明其他内存已损坏 。” 我用Google搜索和搜索堆栈溢出超过2天,但是没有得到正确的解决方案。 我只在少数图像上出现此错误,而其他图像工作正常 ...
public void Convert2GrayScaleFast(Bitmap bmp)
{
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
int stopAddress = (int)p + bmData.Stride * bmData.Height;
while ((int)p != stopAddress)
{
p[0] = (byte)(.299 * p[2] + .587 * p[1] + .114 * p[0]);
p[1] = p[0];
p[2] = p[0];
p += 3;
}
}
bmp.UnlockBits(bmData);
}
我在这行中得到了例外
p[0] = (byte)(.299 * p[2] + .587 * p[1] + .114 * p[0]);
不要告诉使用工具菜单->选项->调试->常规->取消绕过异常取消选中此选项“在模块加载时抑制JIT优化”。 我尝试了所有方法,但对我没有任何帮助。
这是引发异常的图像,非常感谢您帮助我解决问题。
将条件更改为:
while ((int)p < stopAddress)
您还应该考虑将步幅向上舍入为四个字节的边界,并且可以为负(位图是自底向上的) https://msdn.microsoft.com/zh-cn/library/system.drawing.imaging。我建议: bitmapdata.stride(v = vs.110).aspx :
int numberOfBytesPerPixel = Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
int stopAddress = (int)p + (bmData.Width * numberOfBytesPerPixel) * bmData.Height;
while ((int)p < stopAddress)
{
// add pixel manipulation here
p += numberOfBytesPerPixel;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.