Что такое 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;
}