Получить значение пикселя - C#
Формулировка задачи:
Стоит задача быстро получить значения всех пикселей изображения. Решаю так:
Кладем изображение в массив байтов:
Получаю значение по заданным x,y:
Однако код возвращает полную ерунду. Подскажите пожалуйста, где ошибка?
// Получаем высоту и ширину bitmap Width = ImageSource.Width; Height = ImageSource.Height; //лочим область по размеру изображения bitmapData = ImageSource.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadWrite, ImageSource.PixelFormat); //глубина изображения (число бит на пиксель) Depth = Bitmap.GetPixelFormatSize(ImageSource.PixelFormat); //число байт на пиксель int bytesPerPixel = Depth / 8; //общее число байтов для изображения int byteCount = bytesPerPixel * Height * Width; //пустой массив байтов изображения Pixels = new byte[byteCount]; //указатель на первый пиксель ptrFirstPixel = bitmapData.Scan0; //копируем данные из указателя в массив байтов Marshal.Copy(ptrFirstPixel, Pixels, 0, Pixels.Length);
public Color GetPixel(int x, int y) { Color clr = Color.Empty; //число байт на пиксель int bytesPerPixel = Depth / 8; //число байт в одной строке пикселей изображения int widthInBytes = bitmapData.Width * bytesPerPixel; //индекс первого байта пикселя int i = y * widthInBytes + x * bytesPerPixel; if (i >= Pixels.Length - bytesPerPixel) throw new IndexOutOfRangeException(); int b = Pixels[i]; int g = Pixels[i + 1]; int r = Pixels[i + 2]; clr = Color.FromArgb(r, g, b); return clr; }
Решение задачи: «Получить значение пикселя»
textual
Листинг программы
public Color GetPixel(int x, int y) { Color clr = Color.Empty; //число байт на пиксель int bytesPerPixel = Depth / 8; //индекс первого байта пикселя int i = y * bitmapData.Stride + x * bytesPerPixel; if (i >= Pixels.Length - bytesPerPixel) throw new IndexOutOfRangeException(); int b = Pixels[i]; int g = Pixels[i + 1]; int r = Pixels[i + 2]; clr = Color.FromArgb(r, g, b); return clr; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д