Я не знаю лучшего названия, но опишу проблему.
Используемое нами оборудование может отображать изображения.
Может отображать черно-белое изображение с разрешением 64 х 256.
Проблема в формате изображения, которое мы должны отправить на устройство.
Это не стандартный растровый формат, а просто массив
байты, представляющие каждый пиксель изображения.
0 = черный, 1 = белый.
Таким образом, если бы у нас было изображение размером: 4 x 4, массив байтов мог бы выглядеть примерно так:
1000 0100 0010 0001
И изображение будет выглядеть так:
Растровое изображение http://www.mediafire.com/imgbnc.php/6ee6a28148d0170708cb10ec7ce6512e4g.jpg
Проблема в том, что нам нужно создать это изображение, создав монохромное растровое изображение.
в C #, а затем преобразовать его в формат файла, понятный для устройства.
Например, можно отобразить текст на устройстве. Для этого он
необходимо создать растровое изображение и записать в него текст:
var bitmap = new Bitmap(256, 64);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.DrawString("Hello World", new Font("Courier", 10, FontStyle.Regular), new SolidBrush(Color.White), 1, 1);
}
Здесь есть 2 проблемы:
- Сгенерированное растровое изображение не является монохромным
- Сгенерированное растровое изображение имеет другой двоичный формат
Так что мне нужен способ:
- Создание монохромного растрового изображения в .NET
- Считывание отдельных цветов пикселей для каждого пикселя в растровом изображении
Я обнаружил, что вы можете установить глубину пикселя в 16, 24 или 32 бита, но не нашел монохромный, и я не знаю, как прочитать данные пикселей.
Предложения приветствуются.
ОБНОВЛЕНИЕ: Я не могу использовать Win32 PInvokes ... должен быть нейтральным на платформе!
СЛЕДУЙТЕ ЗА: Следующий код работает для меня сейчас. (На всякий случай, если это кому-нибудь нужно)
private static byte[] GetLedBytes(Bitmap bitmap)
{
int threshold = 127;
int index = 0;
int dimensions = bitmap.Height * bitmap.Width;
BitArray bits = new BitArray(dimensions);
//Vertically
for (int y = 0; y < bitmap.Height; y++)
{
//Horizontally
for (int x = 0; x < bitmap.Width; x++)
{
Color c = bitmap.GetPixel(x, y);
int luminance = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bits[index] = (luminance > threshold);
index++;
}
}
byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);
return data;
}