Я не знаю лучшего названия, но я опишу проблему.Чтение монохромных цветов растровых изображений
Аппаратное обеспечение, которое мы используем, имеет возможность отображения изображений. Он может отображать черно-белое изображение с разрешением 64 x 256.
Проблема заключается в формате изображения, которое мы должны отправить на устройство. Это не стандартный формат растрового изображения, а вместо этого это просто массив из байт, представляющий каждый пиксель изображения.
0 = черный, 1 = белый.
Так что, если мы имели изображение с размером: 4 х 4 байтовый массив может выглядеть примерно так:
и изображение будет выглядеть следующим образом:
Bitmap 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 бит, но не нашли монохромный, и я понятия не имею, как читать данные пикселя.
Предложения приветствуются.
UPDATE: Я не могу использовать Win32 PInvokes ... должен быть нейтральным платформой!
FOLLOW UP: Следующий код работает для меня сейчас. (Только в случае, если кто-нибудь это нужно)
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;
}
Точка для этого! Но если вы используете Bitmap.LockBits вместо Bitmap.GetPixel, вы получаете превосходную производительность! –
Thnx! С небольшими корректировками этот код работает как шарм :-) – TimothyP
danbystrom: Вы правы, хотели, чтобы код образца был чистым и без указателей. – arul