Получение цветов пикселей монохромного изображения с помощью C# ⇐ C#
-
Anonymous
Получение цветов пикселей монохромного изображения с помощью C#
Как сказано в теме, у меня есть изображение .bmp, и мне нужно написать код, который сможет получить цвет любого пикселя изображения. Это (индексированное) изображение размером 1 бит на пиксель, поэтому цвет будет либо черным, либо белым. Вот код, который у меня сейчас есть:
//Этот метод блокирует биты строки пикселей Private BitmapData LockLine (растровое изображение bmp, int y) { Прямоугольник lineRect = новый прямоугольник (0, y, bmp.Width, 1); Строка BitmapData = bmp.LockBits(lineRect, ImageLockMode.ReadWrite, bmp.PixelFormat); обратная линия; } //Этот метод принимает BitmapData строки пикселей //и возвращает цвет того, который имеет нужную координату x частный цвет GetPixelColor (данные BitmapData, int x) { //Я не уверен, правильна ли эта строка IntPtr pPixel = data.Scan0 + x; //Следующий код работает для изображения с разрешением 24 бита на пиксель: байт[] rgbValues = новый байт[3]; System.Runtime.InteropServices.Marshal.Copy(pPixel, rgbValues, 0, 3); return Color.FromArgb(rgbValues[2], rgbValues[1], rgbValues[0]); } Но как мне заставить это работать с изображением с разрешением 1 бит на пиксель? Если я читаю только один байт из указателя, он всегда имеет значение 255, поэтому я предполагаю, что делаю что-то не так.
Пожалуйста, не предлагайте использовать метод System.Drawing.Bitmap.GetPixel, поскольку он работает слишком медленно, а я хочу, чтобы код работал как можно быстрее. Заранее спасибо.
РЕДАКТИРОВАТЬ: Вот код, который работает нормально, на случай, если кому-то это понадобится:
Private Color GetPixelColor (данные BitmapData, int x) { int byteIndex = х/8; int bitIndex = х% 8; IntPtr pFirstPixel = data.Scan0+byteIndex; цвет байта[] = новый байт[1]; System.Runtime.InteropServices.Marshal.Copy(pFirstPixel, цвет, 0, 1); Биты BitArray = новый BitArray (цвет); вернуть биты.Get(bitIndex)? Цвет.Черный : Цвет.Белый; }
Как сказано в теме, у меня есть изображение .bmp, и мне нужно написать код, который сможет получить цвет любого пикселя изображения. Это (индексированное) изображение размером 1 бит на пиксель, поэтому цвет будет либо черным, либо белым. Вот код, который у меня сейчас есть:
//Этот метод блокирует биты строки пикселей Private BitmapData LockLine (растровое изображение bmp, int y) { Прямоугольник lineRect = новый прямоугольник (0, y, bmp.Width, 1); Строка BitmapData = bmp.LockBits(lineRect, ImageLockMode.ReadWrite, bmp.PixelFormat); обратная линия; } //Этот метод принимает BitmapData строки пикселей //и возвращает цвет того, который имеет нужную координату x частный цвет GetPixelColor (данные BitmapData, int x) { //Я не уверен, правильна ли эта строка IntPtr pPixel = data.Scan0 + x; //Следующий код работает для изображения с разрешением 24 бита на пиксель: байт[] rgbValues = новый байт[3]; System.Runtime.InteropServices.Marshal.Copy(pPixel, rgbValues, 0, 3); return Color.FromArgb(rgbValues[2], rgbValues[1], rgbValues[0]); } Но как мне заставить это работать с изображением с разрешением 1 бит на пиксель? Если я читаю только один байт из указателя, он всегда имеет значение 255, поэтому я предполагаю, что делаю что-то не так.
Пожалуйста, не предлагайте использовать метод System.Drawing.Bitmap.GetPixel, поскольку он работает слишком медленно, а я хочу, чтобы код работал как можно быстрее. Заранее спасибо.
РЕДАКТИРОВАТЬ: Вот код, который работает нормально, на случай, если кому-то это понадобится:
Private Color GetPixelColor (данные BitmapData, int x) { int byteIndex = х/8; int bitIndex = х% 8; IntPtr pFirstPixel = data.Scan0+byteIndex; цвет байта[] = новый байт[1]; System.Runtime.InteropServices.Marshal.Copy(pFirstPixel, цвет, 0, 1); Биты BitArray = новый BitArray (цвет); вернуть биты.Get(bitIndex)? Цвет.Черный : Цвет.Белый; }
Мобильная версия