扫描位图横向读取,翻转? (C#)

时间:2012-08-02 20:27:28

标签: c# .net image image-processing bitmap

我有一个简单的文件,它读取单色位图(即黑色和白色)并打印出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 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:2)

你正在侧面打印它。你的y循环应该是外循环,这样你就可以一次写一行。

答案 2 :(得分:1)

你的宽度和高度向后循环。你最里面的循环是从图像的顶部到图像的底部。

答案 3 :(得分:1)

看起来我内圈正在扫描渐进的Y值,外观使用不同的X值。假设输入数据处于“正常”扫描顺序,这将导致您看到的旋转。 - 卡尔