Что такое bitmapData.Stride? - C#

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

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

Мне нужно записать изображение в массив байтов. Во всех источниках это делается через bitmapData.Stride:
Листинг программы
  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. int ByteCount = bitmapData.Stride * ImageSource.Height;
  7. Pixels = new byte[ByteCount];
  8. //указатель на первый пиксель
  9. ptrFirstPixel = bitmapData.Scan0;
  10. //копируем данные из указателя в массив байтов
  11. Marshal.Copy(ptrFirstPixel, Pixels, 0, Pixels.Length);
Однако я не могу понять, что это за число получается :
Листинг программы
  1. int ByteCount = bitmapData.Stride * ImageSource.Height;
Мне логичнее казалось писать вот так:
Листинг программы
  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);
Однако при проверке такой массив выдает ерунду. Так что же такое этот Stride? И как обратиться к пикселю по заданным x,y ? Пробовала так, не работает:
Листинг программы
  1. //число байт на пиксель
  2. int bytesPerPixel = Depth / 8;
  3. //число байт в одной строке пикселей изображения
  4. int widthInBytes = bitmapData.Width * bytesPerPixel;
  5. //индекс первого байта пикселя
  6. int i = y * widthInBytes + x * bytesPerPixel;
  7. if (i >= bytesPerPixel * Height * Width) throw new IndexOutOfRangeException();
  8. int b = Pixels[i];
  9. int g = Pixels[i + 1];
  10. int r = Pixels[i + 2];
Пожалуйста, помогите разобраться, а то третий день код поворачиваю так и эдак.

Решение задачи: «Что такое bitmapData.Stride?»

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.         }

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


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

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

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

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

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

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