2012-04-26 52 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

相關問題