[英]Compare RGB colors in a pixel and change its original color to the closest one
我的任务需要帮助。 基本上,这就是我想要做的:
PictureBox
结果,我将获得具有这三种基色的图像。
我写了这样的代码:
Bitmap img = new Bitmap(InputPictureBox.Image);
byte R, G, B;
Color pixelColor;
for (int x = 0; x < img.Width; x++)
{
for (int y = 0; y < img.Height; y++)
{
pixelColor = img.GetPixel(x, y);
R = (byte) Math.Abs(pixelColor.R - 255);
G = (byte) Math.Abs(pixelColor.G - 255);
B = (byte) Math.Abs(pixelColor.B - 255);
if (R < G && R < B)
{
pixelColor = Color.Red;
}
else if (G < R && G < B)
{
pixelColor = Color.Green;
}
else if (B < R && B < G)
{
pixelColor = Color.Blue;
}
}
}
OutputPictureBox.Image = img;
问题是彩色图像然后转向反转。 那么,我的代码有什么问题? 我假设if
语句不起作用,但我不知道为什么。 我错了吗?
还有一个问题与我上面的代码有关,它实际上可以通过简单地计算R / G / B值的差距来实现,或者它必须通过使用欧几里德距离完成吗?
如果您不介意,请告诉我如何解决这个问题或者如何编写代码。 我读过一个非常相似的问题,但给出的答案仍然没有给我一些线索。
你的代码实际上是有效的,尽管有一些过度的思考。
试试这个:
代码已移至 帖子底部的“更新” 部分
结果:
我已经删除了过度思考的部分。
没有理由(至少从阅读你的问题)为什么你需要反转颜色分量值;
简单地做R = pixelColor.R
就足够了;
通过这个,您不必将其视为“红色含量最少 ”,而是“ 如果红色含量最多 , 则为 红色 !”
正如LightStriker指出的那样 :您缺少(代码中没有任何地方)将新值设置回图像的代码;
img.SetPixel(x, y, pixelColor)
。 我添加了一个else
子句来匹配没有单个颜色分量大于其他颜色分量的像素。
例如,黄色(255,255,0)将不符合您的规则;
使用此答案中的版本,它将被Black
像素替换。
更新:根据以下评论要求进一步澄清。 以下是添加更多条件语句的方法:
// NEW (start) --------------------------------------------------
Color[] randomizedColors = new Color[] { Color.Red, Color.Green, Color.Blue };
Random randomizer = new Random();
// NEW (end) --------------------------------------------------
Bitmap img = new Bitmap(InputPictureBox.Image);
byte R, G, B;
Color pixelColor;
// NEW (start) --------------------------------------------------
Func<int, Color> ColorRandomizer = (numberOfColors) =>
{
if (numberOfColors > randomizedColors.Length)
{
numberOfColors = randomizedColors.Length;
}
return randomizedColors[randomizer.Next(numberOfColors)];
};
// NEW (end) --------------------------------------------------
for (int x = 0; x < img.Width; x++)
{
for (int y = 0; y < img.Height; y++)
{
pixelColor = img.GetPixel(x, y);
R = pixelColor.R;
G = pixelColor.G;
B = pixelColor.B;
if (R > G && R > B)
{
pixelColor = Color.Red;
}
else if (G > R && G > B)
{
pixelColor = Color.Green;
}
else if (B > R && B > G)
{
pixelColor = Color.Blue;
}
// NEW (start) --------------------------------------------------
else if (pixelColor == Color.Yellow)
{
// 2 = Red or Green
pixelColor = ColorRandomizer(2);
}
else if (pixelColor = Color.FromArgb(152, 152, 152))
{
// 3 = Red, Green, or Blue
pixelColor = ColorRandomizer(3);
}
/* else if (pixelColor = Some_Other_Color)
{
// 3 = Red, Green, or Blue
pixelColor = ColorRandomizer(3);
} */
// NEW (end) --------------------------------------------------
else
{
pixelColor = Color.Black;
}
img.SetPixel(x, y, pixelColor);
}
}
OutputPictureBox.Image = img;
使用此更新的代码,将随机选取的所有颜色添加到randomizedColors
数组中。 使用lambda函数ColorRandomizer
来帮助随机选择颜色; 请记住,此函数将在第一个元素和指定的元素之间随机选择。
以下是反转所有颜色。
R = (byte) Math.Abs(pixelColor.R - 255);
G = (byte) Math.Abs(pixelColor.G - 255);
B = (byte) Math.Abs(pixelColor.B - 255);
您可以使用:
R = (byte) pixelColor.R;
G = (byte) pixelColor.G;
B = (byte) pixelColor.B;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.