C# 比较像素中的RGB颜色,并将其原始颜色更改为最接近的颜色
我的任务需要帮助。基本上,这就是我想要做的:C# 比较像素中的RGB颜色,并将其原始颜色更改为最接近的颜色,c#,colors,pixel,rgb,C#,Colors,Pixel,Rgb,我的任务需要帮助。基本上,这就是我想要做的: 将图像加载到PictureBox 计算每个像素中255(最大值)和R值之间的差值,255和G值之间的差值,以及B值之间的差值 根据上述计算,最小绝对值表示像素的颜色更接近该颜色(例如:(255-R值)具有最小绝对值,因此像素更接近该颜色) 将像素颜色更改为更接近的颜色(在上面的示例中,这意味着将其更改为红色) 在输出图片框中显示结果 因此,我将获得具有这三种原色的图像 我编写了如下代码: Bitmap img = new Bitmap(I
- 将图像加载到
PictureBox
- 计算每个像素中255(最大值)和R值之间的差值,255和G值之间的差值,以及B值之间的差值
- 根据上述计算,最小绝对值表示像素的颜色更接近该颜色(例如:(255-R值)具有最小绝对值,因此像素更接近该颜色)
- 将像素颜色更改为更接近的颜色(在上面的示例中,这意味着将其更改为红色)
- 在输出图片框中显示结果
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;
Bitmap img=新位图(InputPictureBox.Image);
字节R,G,B;
彩色像素;
对于(int x=0;x
问题是,彩色图像随后会反转。那么,我的代码出了什么问题?我假设if
语句不起作用,但我不知道为什么。我错了吗
还有一个问题与我上面的代码有关,它是否可以通过简单地计算R/G/B值的间隙来工作,或者完全必须使用欧几里德距离来完成
如果你不介意,请告诉我如何解决这个问题,或者代码应该如何编写。我曾经读过一个非常类似的问题,但给出的答案仍然没有给我一个线索 下面是反转所有颜色
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;
您的代码实际上是有效的,尽管其中有一些过度思考 试试这个: 代码已移至帖子底部的更新部分 结果:
我已经删除了过度思考的部分
- 没有理由(至少从阅读您的问题)需要反转颜色分量值
- 简单地做
就足够了R=pixelColor.R
- 通过这一点,你不必把它看作是“哪一个拥有最少的
img.SetPixel(x,y,pixelColor)
实现的else
子句来匹配没有单色分量大于其他两种分量的像素
黑色
像素替换更新:按照要求进一步澄清的要求。以下是如何添加更多条件语句:
// 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;
//新建(开始)--------------------------------------------------
Color[]randomizedColors=新颜色[]{Color.Red,Color.Green,Color.Blue};
随机随机发生器=新随机();
//新(完)--------------------------------------------------
位图img=新位图(InputPictureBox.Image);
字节R,G,B;
彩色像素;
//新(开始)--------------------------------------------------
Func ColorRandomizer=(numberOfColors)=>
{
如果(NumberOfColor>RandomizedColor.Length)
{
NumberOfColor=随机颜色。长度;
}
返回randomizedColors[randomizer.Next(numberOfColors)];
};
//新(完)--------------------------------------------------
对于(int x=0;xG&&R>B)
{
pixelColor=颜色。红色;
}
否则如果(G>R&&G>B)
{
pixelColor=Color.Green;
}
否则如果(B>R&B>G)
{
pixelColor=颜色。蓝色;
}
//新(开始)--------------------------------------------------
else if(pixelColor==Color.Yellow)
{
//2=红色或绿色
pixelColor=颜色随机化器(2);
}
else if(pixelColor=Color.FromArgb(152152152))
{
//3=红色、绿色或蓝色
pixelColor=色彩随机化器(3);
}
/*else if(像素颜色=某些其他颜色)
{
//3=红色、绿色或蓝色
pixelColor=色彩随机化器(3);
} */
//新(完)--------------------------------------------------
其他的
{
pixelColor=颜色。黑色;
}
img.SetPixel(x,y,pixelColor);
}
}
OutputPictureBox.Image=img;
使用此更新的代码,将所有应随机拾取的颜色添加到randomizedColors
数组中。使用lambda函数,ColorRandomizer
,帮助随机选择颜色;请记住,此函数将在第一个元素和指定元素之间随机选择。使用m访问位图数据