Что такое bitmapData.Stride? - C#
Формулировка задачи:
Мне нужно записать изображение в массив байтов. Во всех источниках это делается через bitmapData.Stride:
Однако я не могу понять, что это за число получается :
Мне логичнее казалось писать вот так:
Однако при проверке такой массив выдает ерунду. Так что же такое этот Stride?
И как обратиться к пикселю по заданным x,y ? Пробовала так, не работает:
Пожалуйста, помогите разобраться, а то третий день код поворачиваю так и эдак.
Листинг программы
- // Получаем высоту и ширину 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);
Листинг программы
- //число байт на пиксель
- 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д