より適切なタイトルはわかりませんが、問題について説明します。
私たちが使用するハードウェアには、画像を表示する機能があります。64 x 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;
}