【问题标题】:Access violation Exception in C#C#中的访问冲突异常
【发布时间】:2016-03-27 05:12:35
【问题描述】:

我正在使用 C# 进行图像处理项目。我正在使用 OTSU 阈值方法。我收到此异常“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”我用谷歌搜索堆栈溢出超过 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 优化”。我已经尝试了所有方法,但对我没有任何效果..

Here is the image which throws the exception如果你能帮我解决问题,非常感谢。

【问题讨论】:

  • Airtel 4G 跑得太快了。由于 4G 的速度和延迟,我确信 Windows 无法处理该文件。你试过其他没有airtel 4G的照片吗?
  • @Anirugu 哇,好幽默!任何我如何找到使用 EMGU 进行 otsu 阈值处理的方法......但我没有解决这个问题......感谢您的评论......
  • 我使用 EMGU CV 找到阈值解决了我的问题。但我无法解决这个问题。如果有人解决了这个问题,它可能对任何人都有帮助...
  • 旁注:您应该先让安全代码正常工作,然后再将其转换为不安全...,而不是“我用谷歌搜索并搜索堆栈溢出超过 2 天”

标签: c# image-processing


【解决方案1】:

将条件更改为:

while ((int)p < stopAddress)

【讨论】:

    【解决方案2】:

    您还应该考虑到步幅向上舍入到四字节边界并且可以是负数(位图自下而上)https://msdn.microsoft.com/en-us/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;
                }
    

    【讨论】:

    • 这段代码实际上并没有跳过步幅末尾的字节。您应该跟踪 x 和 y 以准确确定何时跳到下一行..
    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多