3

より適切なタイトルはわかりませんが、問題について説明します。

私たちが使用するハードウェアには、画像を表示する機能があります。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 つの問題があります。

  1. 生成されたビットマップはモノクロではありません
  2. 生成されたビットマップのバイナリ形式が異なります

したがって、次の方法が必要です。

  1. .NET でモノクロ ビットマップを生成する
  2. ビットマップ内の各ピクセルの個々のピクセル カラーを読み取る

ピクセル深度を 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;
}
4

7 に答える 7

6

各ピクセルの輝度を計算し、それをしきい値と比較します。

y=0.3*R+0.59G*G+0.11*B

しきい値が 127 であるとします。

const int threshold = 127;
Bitmap bm = { some source bitmap };

byte[,] buffer = new byte[64,256];

for(int y=0;y<bm.Height;y++)
{
  for(int x=0;x<bm.Width;x++)
  {
   Color c=source.GetPixel(x,y);
   int luminance = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11);
   buffer[x,y] = (luminance  > 127) ? 1 : 0;
  }
}
于 2009-03-02T11:30:41.217 に答える
1

上記のコードに感謝します-モノクロ画像を2D配列に変換しようとしていますが、1-黒0-白ですが、問題があります-コードを使用して8x8 bmp画像を読み込み、その内容を出力していますを使用してテキストボックスに

myGrid =GetLedBytes(myBmp);
     for (int x = 1; x < 8; x++)
     {
         textBox1.Text = textBox1.Text + Convert.ToString(myGrid[x])+ "  ";
     }

ただし、結果としてテキストボックスにこれが表示されます。

225  231  231  231  231  129  255  

0と1になるようにするにはどうすればよいですか?

于 2010-04-07T17:35:23.520 に答える
1

私はC#を知りません。それを行うにはおそらく多くの方法があります。これが簡単な方法です。

  1. デバイス要件に等しいサイズの空白の黒いビットマップ イメージを作成します。テキスト、図など、描きたいものは何でも描きます。

  2. 次に、画像のしきい値を設定します。つまり、画像のピクセルの強度値をゼロに設定し、それ以外の場合はゼロに設定します。たとえば、すべての強度値 > 0 を 1 に設定します。

  3. デバイスに必要な形式に変換します。サイズ (64 * 256)/8 のバイト配列を作成します。以前のビットマップの対応するピクセル値が 1 である場合は、対応するビットを 1 に設定します。それ以外の場合は、それらを 0 にリセットします。

編集: ステップ 3. ビット演算子を使用してビットを設定します。

于 2009-03-02T11:21:05.797 に答える
1

ビットマップ全体をある形式から別の形式に変換するために、ビットマップの GetPixel メソッドを使用しないでください。これは効果がありません。代わりに、LockBitsメソッドを使用して画像バッファーのコピーにアクセスし、それを目的の形式に変換する必要があります。モノクロに変換するかどうかは完全にはわかりませんが、PixelFormat列挙にFormat1bppIndexed値があり、役立つ場合があります。

于 2009-03-02T11:40:08.637 に答える
1

コンストラクターでピクセルフォーマットを指定してみてください:

var bitmap = new Bitmap(256, 64, PixelFormat.Format1bppIndexed);

他のプラットフォームでモノクロ ビットマップを描画したときに、アンチエイリアシングを無効にしなければならないことがありました。そうしないと、レンダリングされたテキストが表示されません。

graphics.SmoothingMode=SmoothingMode.None;

YMMV。

于 2009-03-02T11:43:28.877 に答える
1

Bitmap には、使用できる GetPixel メソッドがあります。これにより、ビットマップに描画し、後で必要な形式に変換できます。

Windows フォームのビットマップ (つまり、Graphics.FromImage を介してアクセス) は 24 bpp (32 bpp でしょうか? まだ時期尚早で、正直忘れています)。それにもかかわらず、GetPixel は Color オブジェクトを返すため、ビットマップのビット深度は重要ではありません。次のようにコードを書くことをお勧めします。

MyBitmapFormat ToMyBitmap(Bitmap b)
{
    MyBitmapFormat mine = new MyBitmapFormat(b.Width, b.Height);

    for (int y=0; y < b.Height; y++) {
        for (int x=0; x < b.Width; x++) {
            mine.SetPixel(x, y, ColorIsBlackish(b.GetPixel(x, y)));
        }
    }
}

bool ColorIsBlackish(Color c)
{
    return Luminance(c) < 128; // 128 is midline
}

int Luminance(c)
{
    return (int)(0.299 * Color.Red + 0.587 * Color.Green + 0.114 * Color.Blue);
}

このプロセスは単純しきい値処理と呼ばれます。脳死状態ですが、最初のカットとして機能します。

于 2009-03-02T11:44:34.600 に答える
0

この章には、モノ ビットマップを作成するコードが含まれています。SaveImage サンプルは興味深いものです。

于 2009-03-02T11:11:45.973 に答える