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

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

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

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

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

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

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


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

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

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