繁体   English   中英

C#中的访问冲突异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM