我需要一个能够读取迷宫的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);
答案 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(即半个字节)?