c#从图像中打印出黑色和白色

时间:2018-01-12 21:32:10

标签: c# console

我需要一个能够读取迷宫的160x160图像的代码,检查它是否有白色或黑色像素,如果它是黑色或白色则打印像素x和y位置

示例:

134,27:w

我需要每个像素

现在我有以下内容:

Bitmap maze = new Bitmap ("images/maze.png");
int[][] colors = new int[maze.Width][];
for (int i = 0; i < colors.Length; i++) 
    colors[i] = new int[maze.Height];
for (int x = 0; x < maze.Width; x++) 
    for (int y = 0; y < maze.Height; y++) 
        colors[x][y] = maze.GetPixel (x, y);

1 个答案:

答案 0 :(得分:0)

首先,您无法将Color存储为int,这就是您应该从int[][]切换到Color[][]的原因。

要输出您想要的结果,只需再次循环遍历数组,使用string.Format()和一些条件运算符将结果格式化一点。

for (int x = 0; x < maze.Width; x++) 
    for (int y = 0; y < maze.Height; y++) 
        Console.WriteLine(string.Format("{0}, {1}: {2}",
            x, y,
            colors[x][y].ToArgb() == Color.Black.ToArgb() ? "b" : (colors[x][y].ToArgb() == Color.White.ToArgb() ? "w" : "n")
            ));

请注意,如果像素既不是黑色也不是白色,此代码会输出n

另请注意,您也可以省略string.Format()方法,因为Console.WriteLine()函数包含格式化可能性的重载。

编辑:

如果要将颜色定义为 white ,如果RGB颜色大于(例如170),则可以将RGB值相加(此处不包括alpha值,因为读取图像数据主要是完成没有透明度)并检查它们的总和是否大于170 * 3.

Color current = colors[x][y];
int rgbSum = current.R + current.G + current.B;
char whiteOrBlack = (170 * 3 < rgbSum) ? 'w' : 'b';
Console.WriteLine(string.Format("{0}, {1}: {2}", x, y, whiteOrBlack));

我只想指出 170 在这里使用的是一个相当奇怪的数字。也许你的意思更可能是128(即半个字节)?