【发布时间】:2013-04-12 06:44:21
【问题描述】:
我的作业需要帮助。基本上,这就是我想要做的:
- 将图像加载到
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;
问题是彩色图像随后会反转。那么,我的代码有什么问题?我认为if 语句不起作用,但我不知道为什么。我错了吗?
还有一个与我上面的代码相关的问题,它是否可以通过简单地计算 R/G/B 值的差距来实现,或者它绝对必须通过使用欧几里得距离来完成?
如果您不介意,请告诉我如何解决这个问题,或者应该如何编写代码。我曾经读过一个非常相似的问题,但给出的答案仍然没有给我一个线索。
【问题讨论】:
-
使用托管 API 访问位图数据通常太慢了。考虑使用不安全的函数指针直接读取和操作位图数据。这是一篇我喜欢的好文章:bobpowell.net/lockingbits.htm
-
我建议将 'Math.Abs(pixelColor.R - 255)' 替换为 '255 - pixelColor.R',因为您知道这始终是积极的。
-
@ByteBlast 啊,是的,谢谢你的评论。我已经阅读了一些关于不安全模式的参考资料,然后是 lockbits,但现在我想解决如何修复上面的代码
-
@JoeF 我曾尝试过“Math.Abs(pixelColor.R - 255)”和“255 - pixelColor.R”,但它们仍然会使颜色反转。怎么了? :(
-
但是你没有在任何地方输入新的颜色......你没有用“pixelColor”做任何事情。我在任何地方都看不到“SetPixel”。