Быстрый способ преобразовать растровое изображение в логический массив в C #?

Я делаю приложение XNA, где я делаю снимок экрана с веб-камеры 4 раза в секунду, а затем пытаюсь преобразовать его в логический массив, когда цвет пикселя Red ниже определенного порога. Когда я конвертирую его в Texture2D, он не запаздывает, но когда я пытаюсь получить отдельные пиксели, он запаздывает, даже если разрешение веб-камеры составляет 176x144.

Это код для захвата растрового изображения:

<code>public Bitmap getBitmap()
    {
        if (!panelVideoPreview.IsDisposed)
        {
            Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height, PixelFormat.Format32bppRgb);
            using (Graphics g = Graphics.FromImage(b))
            {
                Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
                Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
                g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
            }

            return b;
        }
        else
        {
            Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height);
            return b;
        }
    }
</code>

Это код для преобразования растрового изображения в логический массив:

<code>public bool[,] getBoolBitmap(uint treshold)
    {
        Bitmap b = getBitmap();

        bool[,] ar = new bool[b.Width, b.Height];

        for (int y = 0; y < b.Height; y++)
        {
            for (int x = 0; x < b.Width; x++)
            {
                if (b.GetPixel(x, y).R < treshold)
                {
                    ar[x, y] = false;
                }
                else
                {
                    ar[x, y] = true;
                }
            }
        }

        return ar;
    }
</code>
 Hans Passant02 мая 2012 г., 15:34
GetPixel () очень медленный, он должен блокировать растровые данные для каждого отдельного пикселя. Вместо этого используйте Bitmap.LockBits (). Много хитов, когда вы положите это в поле поиска.

Ответы на вопрос(1)

Решение Вопроса

Ответ, предоставленный Хансом Пассантом, правильный, лучше использовать LockBits и обрабатывать данные сразу.

Вы также можете попробовать написать шейдер, который порождает данные и, таким образом, использует возможности графического процессора для параллельной обработки потока входного изображения намного, намного быстрее.

Ваш ответ на вопрос