AForge: Попытка чтения или записи в защищенную память - PullRequest
0 голосов
/ 26 апреля 2019

Я имею дело со сбоями программы после добавления новой функции в приложение обработки изображений C # с помощью AForge.Новая функция загружает изображение маски из файловой системы и преобразует замаскированную область в белый фон.Когда функция MaskedFilter запущена, она будет нормально работать для 5–15 изображений, а затем выдает ошибку защищенной памяти и аварийное завершение работы.

Вот код для функции маски:

private void SlabMask(object sender, EventArgs e)
        {           
            Bitmap Mask = (Bitmap)System.Drawing.Image.FromFile(Path.Combine(pictures, "Mask.jpg"));
            int[,] kernel =
            {
                { 0, 0, 0 },
                { 0, 0, 0 },
                { 0, 0, 0 }
            };
            Convolution conv = new Convolution(kernel);
            Invert inv = new Invert();
            Bitmap myImage = (Bitmap)Editor.Image;
            ResizeBilinear makefit = new ResizeBilinear(myImage.Width, myImage.Height);
            Bitmap fitmask = makefit.Apply(Mask);
            MaskedFilter chopBackground = new MaskedFilter(conv, fitmask);
            Bitmap blackBackground = chopBackground.Apply(myImage);
            MaskedFilter makeWhite = new MaskedFilter(inv, fitmask);
            Bitmap whiteBackground = makeWhite.Apply(blackBackground);

            string processedpath = Path.Combine(pictures, baseprocessedpath);
            string newbaseFilename = Path.Combine(processedpath, "comic.jpg");
            string myFilename = newbaseFilename.Insert(newbaseFilename.Length - 4, number.ToString());

            System.Drawing.Imaging.ImageCodecInfo[] codecs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
            System.Drawing.Imaging.ImageCodecInfo ici = null;
            foreach (System.Drawing.Imaging.ImageCodecInfo codec in codecs)
            {
                if (codec.MimeType == "image/jpeg")
                    ici = codec;
            }
            System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
            ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)84); 

            Editor.Image = whiteBackground;
            whiteBackground.Save(myFilename, ici, ep);
        }

А вот трассировка стека при возникновении ошибки:

An unhandled exception of type 'System.AccessViolationException' occurred in AForge.Imaging.dll
    Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
       at AForge.Imaging.Filters.MaskedFilter.ProcessImage(UnmanagedImage image, Rectangle rect, Byte* mask, Int32 maskLineSize)
       at AForge.Imaging.Filters.MaskedFilter.ProcessFilter(UnmanagedImage image, Rectangle rect)
       at AForge.Imaging.Filters.BaseInPlacePartialFilter.Apply(BitmapData imageData)
       at AForge.Imaging.Filters.BaseInPlacePartialFilter.Apply(Bitmap image)
       at VSE.Form1.SlabMask(Object sender, EventArgs e) in Z:\VSE\VSE 2.0\VSE\Form1.cs:line 459
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at VSE.Program.Main() in Z:\VSE\VSE 2.0\VSE\Program.cs:line 19
    The program '[8272] VSE.exe' has exited with code 0 (0x0).

Я все утро бью головой об стену, пытаясь выяснить причину этой аварии.Кто-нибудь знает, как это исправить?Заранее спасибо!

...