Что такое 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д