Получить значение пикселя - C#

Узнай цену своей работы

Формулировка задачи:

Стоит задача быстро получить значения всех пикселей изображения. Решаю так: Кладем изображение в массив байтов:
// Получаем высоту и ширину 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);
Получаю значение по заданным x,y:
 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;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5