Получение 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 шт):
Почему Вы считаете, что размер пиксела 4 байта, игнорируя PixelFormat?
Анализируйте текущий формат, выбирайте метод обработки на его основе.
Строки битмапа во многих случаях лежат снизу вверх - не следует ли это учитывать при обработке буфера?
Длина строки (и соответственно общий размер данных) не обязан быть PixelSize*width, он округляется вверх