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

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

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

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

Решение задачи: «Получить значение пикселя»

textual
Листинг программы
  1. public Color GetPixel(int x, int y)
  2.         {
  3.             Color clr = Color.Empty;
  4.  
  5.             //число байт на пиксель
  6.             int bytesPerPixel = Depth / 8;
  7.  
  8.             //индекс первого байта пикселя
  9.             int i = y * bitmapData.Stride + x * bytesPerPixel;
  10.  
  11.             if (i >= Pixels.Length - bytesPerPixel) throw new IndexOutOfRangeException();
  12.  
  13.             int b = Pixels[i];
  14.             int g = Pixels[i + 1];
  15.             int r = Pixels[i + 2];
  16.             clr = Color.FromArgb(r, g, b);
  17.  
  18.             return clr;
  19.         }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут