【问题标题】:c# printing black and whites out of imagec#在图像中打印黑白
【发布时间】:2018-01-12 21:32:10
【问题描述】:

我需要一个代码来读取迷宫的 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);

【问题讨论】:

  • 该代码无法编译。 GetPixel 返回一个 Color 结构,您不能将其转换为整数
  • 这是作业吗?
  • 这不是作业,我需要它来做一个大项目,如果是作业我不会读大约 1000 个迷宫

标签: c# console


【解决方案1】:

首先,您不能将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(即半字节)?

【讨论】:

  • 以这种方式读取的颜色无法与内置的已知颜色进行比较。应使用colors[x][y].ToArgb() == Color.Black.ToArgb() 进行比较。由于ToArgb() 返回一个int,所以不需要更改colors 数组的结构,只要通过ToArgb() 方法将像素分配给它即可。
  • @JonathonChase 你不能? Color 类不是有一个== 运算符来比较两个参数的编码颜色值吗?正如你所说,我将其切换为包含.ToArgb()
  • 虽然它这样做了,但相等运算符还会比较一些从 GetPixel 调用中读取颜色时不会被拾取的状态标志。你可以阅读更多关于in this questionthis MSDN
  • @JonathonChase 我只是自己在源代码中快速查找的,它确实还比较了状态和其他内容以及值比较,您完全正确。
  • 我有大约 13 个错误 颜色不存在 Bool To Char 错误导致的错误 Current does not exist
猜你喜欢
  • 2018-10-18
  • 2021-11-11
  • 2010-11-09
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多