1

.bmpファイルをバイナリに変換するように設計されたC#プログラムを作成しようとしています。ファイルは16x16ピクセルです。それぞれの黒いピクセルは2進数で1を表すため、数値10は█[]█[] [] [][][]になります。

私が抱えている問題は、私のコードが黒いピクセルを認識していないため、出力が常にゼロになることです。

    public Bitmap imgToDecode;

    private void button2_Click(object sender, EventArgs e)
    {
        int i = (imgToDecode.Height * imgToDecode.Width);
        bool[] pixData = new bool[i];

        int p = 0;

        for (int k = 1; k < imgToDecode.Height; k++)
        {
            for (int m = 1; m < imgToDecode.Width; m++)
            {
                if (imgToDecode.GetPixel(m, k) == Color.Black)
                {
                    pixData[p] = true;
                }
                else
                {
                    pixData[p] = false;
                }
                p++;
            }
        }

        for (int n = 0; n < pixData.Length; n++)
        {
            textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n])));
        }


    }

出力が0である理由について誰かが考えている場合は、私を助けてください。また、コードを改善する方法は歓迎されます。

4

3 に答える 3

3

問題の原因は、おそらくColor.BlackColor.FromArgb(0, 0, 0)と等しくないことです。

解決策は、おそらく次の行を変更することです。

if (imgToDecode.GetPixel(m, k) == Color.Black)

に:

if (imgToDecode.GetPixel(m, k) == Color.FromArgb(0, 0, 0))

またはさらに良いのは、(0,0,0) 色を含む変数を宣言してから、このifステートメントで使用することです。したがって、次のようにします。

 Color black = Color.FromArgb(0, 0, 0);

メソッドの冒頭で、ifを次のように変更します。

if (imgToDecode.GetPixel(m, k) == black)

更新: ループの開始値に小さな問題があるようです。コードを更新しました。

public Bitmap imgToDecode;

private void button2_Click(object sender, EventArgs e)
{
    textBox2.Text = "";

    Color black = Color.FromArgb(0, 0, 0);

    int i = (imgToDecode.Height * imgToDecode.Width);
    bool[] pixData = new bool[i];

    int p = 0;

    for (int k = 0; k < imgToDecode.Height; k++)
    {
        for (int m = 0; m < imgToDecode.Width; m++)
        {
            pixData[p] = (imgToDecode.GetPixel(m, k) == black);

            p++;
        }
    }

    for (int n = 0; n < pixData.Length; n++)
    {
        textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n])));
    }
}

pixData配列にbool値を含める必要がない場合は、int に変更して 1 または 0 を割り当てることができます。この方法では、後で変換する必要はありません :)。

于 2011-12-01T18:09:40.593 に答える
1

このユーティリティを使用して、ビットマップをバイナリ テキストに変換できます。すべてのピクセルチャネルが等しいかどうかを確認してから、 (黒の場合) または(白の場合)0を返します。10

public static IEnumerable<int> ToBinary(this Bitmap imgToDecode)
{
    for (int k = 0; k < imgToDecode.Height; k++)
    {
        for (int m = 0; m < imgToDecode.Width; m++)
        {
            yield return (imgToDecode.GetPixel(m, k).R == 0 && 
                          imgToDecode.GetPixel(m, k).G == 0 && 
                          imgToDecode.GetPixel(m, k).B == 0) ? 1 : 0;
        }
    }
}
于 2011-12-01T18:10:45.720 に答える
0

次の変更を行います。

for (int m = 1; m < imgToDecode.Width; m++)
{
    Color col = imgToDecode.GetPixel(m, k);
    if (col  == Color.Black)   //<---- Put a breakpoint here and see what col is.
    {
        pixData[p] = true;
    }
    ...

「col」でブレークするときは、それが何であるかを確認してください。255,255,255ですか?近いもの?

これにより、少なくとも「黒」ピクセルと「白」ピクセルが何であるかを確認でき、適切に切り替えることができます。

編集:ハンスは、これらのループでは「1」ではなく「0」から開始する必要があることを正しく指摘しています。

于 2011-12-01T18:03:04.427 に答える