【问题标题】:Converting a bitmap to an matrix将位图转换为矩阵
【发布时间】:2013-03-08 17:52:47
【问题描述】:

我一直在尝试将位图对象转换为 int 矩阵。 我在一张空白的白纸上用油漆画了字母“C”,如果位图对象中的像素在同一位置(x,y),程序应该用“0”初始化arr(x,y)是白色的,如果是黑色像素,则相应地为“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

似乎有人能认识到这个问题吗?

【问题讨论】:

  • 为什么循环条件 arr.GetLength(0) - 2 vs arr.GetLength(0) - 1 的第三个(和第四个)?另外,为什么这些循环从 1 而不是 0 开始(基本上是我意识到的相同问题)
  • 我不太确定我是否理解你想要做什么,但你可能想使用 LockBits() 来加快速度:Here's a good example of looping through all of the pixels in a Bitmap

标签: c# matrix bitmap pixel


【解决方案1】:

主要问题是当您将数组输出到控制台时,您是按列而不是按行遍历它。这就是为什么您的阵列看起来旋转了 90 度的原因。

如果在第二个循环部分(输出到控制台的地方),您交换内部和外部循环,您应该会看到更好的结果。

我也同意其他 cmets 的观点: 1)如果你想要更好的性能,使用LockBits/UnlockBits方法访问Bitmap 2) 你的循环索引不正常

如果您使用 x 和 y 而不是 i 和 j,它将帮助您识别何时犯了这些错误。

试试这个:

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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多