Получение rgb пикселя c#

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

Обычный GetPixel мне не подходит из-за скорости. Я нашёл следующий код, но при работе с ним возникают проблемы, например, при загрузки изображений больше 64 пикселей вылетает исключение

System.AccessViolationException "попытка чтения в защищенную память"

на эту строчку: B = scan0[i + 0];, а если уменьшить разрешение картинки в фотошопе или в любом онлайн конвертере, программа неверно получает цвета и на выходе я получаю полную белиберду (цвета определены не верно и картинка вся перекошенная, а так же куча лишних пикселей), скорее всего это из за того, что функция работает только с 32bppArgb, но как это исправить не придумал.

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

Сам код:

public unsafe void GetRGBPixel(Bitmap bmp)
{
    int width = bmp.Width;
    int height = bmp.Height;
    BitmapData bData = bmp.LockBits(
        new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
        ImageLockMode.ReadWrite, bmp.PixelFormat);
    int bytesPerPixel = 4; 
    int maxPointerLenght = width * height * bytesPerPixel;
    byte R, G, B, A;
    byte* scan0 = (byte*)bData.Scan0.ToPointer();
    for (int i = 0; i < maxPointerLenght; i += 4)
    {
        B = scan0[i + 0];
        G = scan0[i + 1];
        R = scan0[i + 2];
        A = scan0[i + 3];
        RC[iterC] = R;
        GC[iterC] = G;
        BC[iterC] = B;
        iterC++;               
    }
    bmp.UnlockBits(bData);
}

Ответы (1 шт):

Автор решения: MBo

Почему Вы считаете, что размер пиксела 4 байта, игнорируя PixelFormat? Анализируйте текущий формат, выбирайте метод обработки на его основе.

Строки битмапа во многих случаях лежат снизу вверх - не следует ли это учитывать при обработке буфера?

Длина строки (и соответственно общий размер данных) не обязан быть PixelSize*width, он округляется вверх

→ Ссылка