我一直在尝试将位图对象转换为int矩阵。 我在空白的白纸上画了字母'C',如果Bitmap对象中的像素在同一位置(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
任何人似乎都能认出这个问题吗?
答案 0 :(得分:1)
主要问题是,当您将数组输出到控制台时,您将按列而不是行遍历它。这就是为什么你的阵列似乎旋转了90度。
如果在第二个循环部分(输出到控制台的地方),你交换内部和外部循环,你会看到更好的结果。
我也同意其他评论: 1)如果想要更好的性能,请使用LockBits / UnlockBits方法访问位图 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();
}
}