System.InvalidOperationException при получении пикселя

199
10 июля 2018, 07:50

Код выполняется в отдельном потоке, вычисляет средний цвет изображения и рисует его на Control'е. При получении цвета пикселя _bmp.LockBits(new Rectangle(0, 0, _bmp.Width, _bmp.Height), ImageLockMode.ReadWrite, _bmp.PixelFormat); выходит сообщение: System.InvalidOperationException in System.Drawing.dll В данный момент объект используется другим процессом.

private void SomeThread()
{
    //..
    Thread th0 = new Thread(new ParameterizedThreadStart(TH_showArt_));
    th0.Start(Puth_);
}

private void TH_showArt_(object puth_)
{
    String Puth_ = puth_.ToString();
    Image img64x64 = Image.FromFile(Puth_);
    //..
    //Считается средний цвет изображения
    string[] MD_C = MPLAY.Lib.BitmapClass.Middle_RGB_str((Bitmap)img64x64).Split(';');
    //..
}

public static string Middle_RGB_str(Bitmap Image_) 
{
    string MD_C = "0;0;0";
    var bb = new BufferedBitmap(Image_);
    for (int i = bb.Height - 1; i > -1; i--)
    {
        for (int j = bb.Width - 1; j > -1; j--)
        {
            //Обертка LockBits, здесь кстати и ошибка
            Color clr = bb.GetPixel(i, j);
            //_bmp.LockBits(
            //    new Rectangle(0, 0, _bmp.Width, _bmp.Height),
            //    ImageLockMode.ReadWrite,
            //    _bmp.PixelFormat
            //);
            //System.InvalidOperationException in System.Drawing.dll В данный момент объект используется другим процессом.
            //..
        }
    }
    //..
    MD_C = avgR.ToString() + ";" + avgG.ToString() + ";" + avgB.ToString();
    return MD_C;
}

Что можно сделать?

Answer 1

Вы параллельно используете _bmp в каком-то еще потоке (скорее всего, в главном). Ищите, где. Bitmap не поддерживает многопоточную работу, поэтому вам надо либо синхронизировать доступ к нему, либо работать с его копией.

READ ALSO
StackFrame, нет имени файла и номера строки

StackFrame, нет имени файла и номера строки

Использую debug - сборку приложения, и хотел бы получить имя строки вызова и имя файлаОднако, в случае имени файла, в текущем кадре хранится значение...

325
Как сделать высокочастотный фильтр? - C#

Как сделать высокочастотный фильтр? - C#

Если при создание низкочастотного я использовал класс ComplexImage Мне нужно сделать что бы изображение получалось как на фильтре, только на оборот...

220
Таймер обратного отсчёта C# [закрыт]

Таймер обратного отсчёта C# [закрыт]

Всем добрый вечер! Мне нужно сделать таймер обратного отсчёта 10 минутВ форме есть кнопка button1, после нажатия кнопки запустить таймер

232
Не работает Style в ListView

Не работает Style в ListView

Есть вот такой вот ListView:

192