2012-04-26 51 views
0

我试图获取图像中每个像素的Hue或“H”,然后更改具有特定Hue的像素的颜色。我试图改变色调> = 210和< = 260的所有像素,这是蓝色的不同色调。从图像中的每个像素获取色相

这里是我的代码:

// 'i' is the image 
// 'b' is the bitmap of the image 
float y; 
for (int a = 0; a < i.Height; a++) 
{ 
    for (int c = 0; c < i.Width; c++) 
    { 
     y = b.GetPixel(c, a).GetHue(); 
     if (y >= 210 && y <= 260) 
      { 
       b.SetPixel(c, a, Color.Black); 
      } 
    } 
} 

唯一的问题是,它没有任何皮卡蓝色,这是从210 - 260。我敢肯定,我正确地这样做,但我不能因为它不工作。

如果你能解决这个问题,请在这里发帖,谢谢!

编辑:我在SetPixel上放了一个断点,它被调用了许多次,所以现在我会检查我是否正确保存图片。

编辑2:我想通了!我没有保存图片。

+0

你应该使用一个调试器:找出哪个像素没有被检测到,设置一个断点,看看它为什么没有通过你的测试。 – Vlad 2012-04-26 11:24:25

+0

我可以对范围进行一些调整,至少用纯蓝色(225)来测试。更可能的问题是保存结果的代码。 – 2012-04-26 13:21:19

+0

是的,按照弗拉德的说法,在'b.SetPixel(c,a,Color.Black)上放一个断点;'看看是否有人叫。 BTW'x'和'y'可能是坐标'a'和'c'的更好名称,'float y'可能是'float hue',更具可读性。 – weston 2012-04-26 15:27:54

回答

0

它适合我。在下面的代码中,我有一个名为imgViwer的带有PictureBox的Windows窗体。然后点击一个按钮,我执行的代码:

private void HueFilter() 
{ 
    float y; 
    Bitmap i = (Bitmap)imgViwer.Image; 

    for (int a = 0; a < i.Height; a++) 
    { 
     for (int c = 0; c < i.Width; c++) 
     {     
      y = i.GetPixel(c, a).GetHue(); 
      if (y >= 210 && y <= 260) 
      { 
       i.SetPixel(c, a, Color.Black); 
      } 
     } 
    } 

    imgViwer.Image = i; 
} 

你的情况,你有一个输出图像称为b应分配回图片框的刷新。

0

使用,LockBits方法,卢克!

或者,我认为最好用Graphics环境来完成。

+0

+1是的,您将看到LockBits的巨大性能提升 – weston 2012-04-26 15:30:22

相关问题