1

私はビットマップオブジェクトをintの行列に変換しようとしています。空白の白いシートにペイントで文字「C」を描画しました。プログラムは、ビットマップオブジェクトのピクセルが同じ位置(x、y)にある場合、その場所(x、y)のarrを「0」で初期化することになっています。は白で、黒のピクセルの場合はそれに対応して「1」です。

私は次のコードを書きました:

 static void Main(string[] args)
    {

          Bitmap arie = new Bitmap(@"C:\Users\User\Desktop\letter.bmp");
          object [,] arr = new object[arie.Width, arie.Height];
        int min=1000,counter=1;
        for (int i = 0; i < arr.GetLength(0) - 1; i++)
        {
            for (int j = 0; j < arr.GetLength(1) - 1; j++)
            {
                if (arie.GetPixel(i, j).ToArgb() == Color.White.ToArgb())
                {
                    arr[i, j] = 0;
                }
                else
                    arr[i, j] = 1;
            }
        }

          for (int i = 1; i < arr.GetLength(0) - 2; i++)
          {
              for (int j = 1; j < arr.GetLength(1) - 2; j++)
              {
                  Console.Write(arr[i, j]);
              }
              Console.WriteLine();
          }

    }

最後に私が描いた文字「C」は次のように出てきました: http: //teachers.web.cern.ch/teachers/archiv/hst2000/teaching/expt/wavesand/image39.gif

誰かが問題を認識しているように見えますか?

4

1 に答える 1

1

主な問題は、配列をコンソールに出力するときに、行ではなく列でトラバースしていることです。そのため、配列が 90 度回転しているように見えます。

2 番目のループ部分 (コンソールに出力している部分) で、内側のループと外側のループを交換すると、より良い結果が得られるはずです。

他のコメントにも同意します: 1) より良いパフォーマンスが必要な場合は、Bitmap にアクセスする LockBits/UnlockBits メソッドを使用してください 2) ループのインデックス作成がうまくいかない

i と j の代わりに x と y を使用すると、この種の間違いをいつ犯しているかを認識するのに役立ちます。

これを試して:

static void Main(string[] args)
{
    Bitmap arie = new Bitmap(@"C:\Users\User\Desktop\letter.bmp");
    object [,] arr = new object[arie.Width, arie.Height];
    int min=1000,counter=1;
    for (int i = 0; i < arie.Width; i++)
    {
        for (int j = 0; j < arie.Height; j++)
        {
            if (arie.GetPixel(i, j).ToArgb() == Color.White.ToArgb())
            {
                arr[i, j] = 0;
            }
            else
                arr[i, j] = 1;
        }
    }

    for (int y = 0; y < arie.Height; y++)
    {
       for (int x = 0; x < arie.Width; x++)
       {
           Console.Write(arr[x, y]);
       }
       Console.WriteLine();
    }
}
于 2013-03-10T21:10:42.630 に答える