Member 13341679 Ответов: 1

Как решить эту ошибку - " попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена."


Я пытаюсь применить фильтр "нерезкая Маска" к изображению. Я использую C#.Net (FrameWork 4.0) и VS 2012. Я попробовал этот код, я также получаю выходное изображение, но только в течение 1-2 секунд, после чего эта ошибка приходит. Я все проверил, но не удалось решить.может кто-нибудь помочь мне выбраться отсюда.
Заранее спасибо.

Что я уже пробовал:

public void unsharp()
{
Oimg = (Bitmap)file.Clone();//input image
for (int x = 0; x < Oimg.Width; x++)
{
for (int y = 0; y < Oimg.Height; y++)
{
Color pixel = Oimg.GetPixel(x, y);

int r = pixel.R;
int g = pixel.G;
int b = pixel.B;

int[] Oarray = new int[] { r, g, b };//input image array

int[] Rarray = new int[Oarray.Length];//resultant image array

newBitmap = (Bitmap)pictureBox1.Image;//filter applied image
for (int m = 0; m < newBitmap.Width; m++)
{
for (int n = 0; n < newBitmap.Height; n++)
{
Color p = newBitmap.GetPixel(m, n);//Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
int r1 = p.R;
int g1 = p.G;
int b1 = p.B;

int[] newarray = new int[] { r1, g1, b1 };//filter applied image array

for (int e = 0; e <= Oarray.Length - 1; e++)
Rarray[e] = Oarray[e] - newarray[e];

//convert array to bitmap
Bitmap Rbmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
int stride = pictureBox1.Width * 4;
unsafe
{
fixed (int* intPtr = &Rarray[Oarray.Length-1])
{
Rbmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, stride, PixelFormat.Format32bppRgb, new IntPtr(intPtr));
}
}
newBitmap = (Bitmap)Rbmp.Clone();
pictureBox1.Image = newBitmap;
}
}
}
}
}

Richard Deeming

Возможно, вы захотите рассмотреть возможность использования Библиотека изображений .NET[^], который уже реализует множество фильтров изображений.

Например: Фильтр маски нерезкости C# [^]

Лицензируется под MIT, а некоторые части кода покрываются CPOL или Apache 2.0:
https://github.com/fschultz/NetImageLibrary/blob/master/License.txt[^]

1 Ответов

Рейтинг:
0

OriginalGriff

Когда вы задали связанный с этим вопрос: Как решить эту ошибку "индекс находился за пределами массива"?[^] сегодня утром я сказал тебе использовать отладчик.
Это единственный инструмент, который может сказать вам, что не так: это зависит от данных в вашем изображении, и у нас нет к ним доступа.

Поэтому поставьте точку останова в первой строке этого метода и начните работать над ним, глядя на то, что происходит - это единственный способ решить эту проблему!


Member 13341679

Я пробовал, как вы сказали, но все равно это не решается.

OriginalGriff

Отладчик не решает эту проблему за вас: он дает вам инструмент, чтобы посмотреть на ваш код во время его выполнения и точно увидеть, что происходит. Содержимое переменных, в какую сторону ветвятся условные обозначения,все это.

Поэтому используйте отладчик и посмотрите, почему он терпит неудачу. Мы не можем сделать это для вас!

Member 13341679

Цвет p = newBitmap.GetPixel(m, n);
Это строка, в которой возникает ошибка, показывающая, что попытка чтения/записи защищенной памяти.

OriginalGriff

Правильно. Поэтому используйте отладчик, чтобы посмотреть на newBitmap, m и n, когда это произойдет.
Если вы не знаете, что в них, вы не можете понять, почему это проблема или как ее исправить...