2

モノクロのビットマップ(つまり、白黒)を読み取り、黒の部分を表すxを出力する単純なファイルがあります。しかし、何らかの理由でコードを追加する必要があることに気づきました

img.RotateFlip(RotateFlipType.Rotate270FlipY);

「正常に」表示されるようにします。言い換えれば、私のコードまたは組み込み関数の実装のいずれかで、画像が読み込まれるときに画像が回転および反転し、意図したものとは逆の動作をしているようです。

私はこれが「意図したとおりに機能する」というよりもばかげた間違いであると確信しているので、以下の関連コードを含めます。

    private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            // Stream objects for capturing image data
            StreamReader sr = new StreamReader(openFileDialog1.OpenFile());
            MemoryStream memStream = new MemoryStream();

            // Image objects containing image data
            Bitmap img = (Bitmap) Bitmap.FromStream(sr.BaseStream);


            /**** HACK ****/
            //img.RotateFlip(RotateFlipType.Rotate270FlipY);
            /****      ****/


            // Save the image data to our memory stream
            img.Save(memStream, ImageFormat.Gif);

            // Save data to a byte array
            byte[] imgData = memStream.ToArray();

            // Print image data
            for (int x = 0; x < img.Width; ++x)
            {
                Color rgb = new Color();
                for (int y = 0; y < img.Height; ++y)
                {
                    rgb = img.GetPixel(x, y);

                    if (rgb.ToArgb().Equals(Color.White.ToArgb()))
                    {
                       textBox1.AppendText(" ");
                    }
                    else
                    {
                        textBox1.AppendText("x");
                    }
                }
                textBox1.AppendText(Environment.NewLine);
            }
        }
    }

文字「B」のビットマップを読み取ると、次のようになります。

「ハック」なし:

     x                         x        
     x                         x        
     x                         x        
     xx                       xx        
     xxxxxxxxxxxxxxxxxxxxxxxxxxx        
     xxxxxxxxxxxxxxxxxxxxxxxxxxx        
     xxxxxxxxxxxxxxxxxxxxxxxxxxx        
     x            x            x        
     x            x            x        
     x            x            x        
     x            x            x        
     x            x            x        
     x            x            x        
     x            x            x        
     x            x            x        
                  x            x        
      x          xx                     
      x         xxxx          x         
      xx       xxx x          x         
       xx     xxxx xx        xx         
       xxxxxxxxxx   xxx    xxx          
         xxxxxxx    xxxxxxxxxx          
           xxx       xxxxxxx            
                       xxx              

「ハック」で:

     xxxxxxxxxxxxxxx                   
        xxxx         xxx               
         xxx           xxx             
         xxx            xx             
         xxx             xx            
         xxx             xx            
         xxx             xxx           
         xxx             xxx           
         xxx             xxx           
         xxx            xxx            
         xxx           xxxx            
         xxx          xxxx             
         xxx         xxxx              
         xxxxxxxxxxxxxx                
         xxx          xxx              
         xxx            xxx            
         xxx             xxx           
         xxx             xxx           
         xxx              xxx          
         xxx              xxx          
         xxx              xxx          
         xxx              xx           
         xxx             xxx           
         xxx             xx            
         xxx            xxx            
        xxxx          xxx              
     xxxxxxxxxxxxxxxx                  

間違いを指摘されるのをとても楽しみにしています。:)

前もって感謝します!

4

4 に答える 4

4

問題は、テキストボックスに入れる内側のループを使用して行を作成しているのに、内側のループがyをループしていることです。それらのループのネストを変更してみて、何が得られるかを確認してください。また、yループは上から開始する必要があります。そうしないと、画像が上下逆になります。

    for (int y = img.Height - 1; y >= 0; --y)
    {
        Color rgb = new Color();
        for (int x = 0; x < img.Width; ++x)
        {
            rgb = img.GetPixel(x, y);

            if (rgb.ToArgb().Equals(Color.White.ToArgb()))
            {
               textBox1.AppendText(" ");
            }
            else
            {
                textBox1.AppendText("x");
            }
        }
        textBox1.AppendText(Environment.NewLine);
    }
于 2012-08-02T20:33:59.393 に答える
2

あなたはそれを横向きに印刷しています。一度yに1行ずつ書き込むように、ループは外側のループである必要があります。

于 2012-08-02T20:32:59.150 に答える
1

幅と高さのループが後方にあります。最も内側のループは、画像の上部から下部に向かっています。

于 2012-08-02T20:33:25.227 に答える
1

内側のループがプログレッシブY値をスキャンしているように見えますが、外側の外観は異なるX値を使用しています。これにより、入力データが「通常の」スキャン順序であると想定して、表示されている回転が発生します。-カール

于 2012-08-02T20:34:53.087 に答える