2012-07-12 79 views
1

我正在尋找按「顏色距離」對列表進行排序。我使用下面的函數來計算兩個顏色之間的距離:按顏色排序列表(Java)

double colorDistance(Color c1, Color c2) { 
    double rmean = (c1.getRed() + c2.getRed())/2; 
    int r = c1.getRed() - c2.getRed(); 
    int g = c1.getGreen() - c2.getGreen(); 
    int b = c1.getBlue() - c2.getBlue(); 
    double weightR = 2 + rmean/256; 
    double weightG = 4.0; 
    double weightB = 2 + (255 - rmean)/256; 
    return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b); 
} 

所以,你可以看到,我使用的是RGB值來計算兩種顏色之間的「距離」。這個函數非常適合我需要計算的東西,因爲我不需要精確的精度。問題是,我需要能夠說明,不僅是距離,而且c1是在c2之前還是之後,以便我可以根據色彩距離創建一個排序列表。

如果不夠清楚,一個例子可能會有所幫助。純黑和純白之間的顏色距離將在256附近。在當前狀態下,對於colorDistance(黑色,白色)和colorDistance(白色,黑色),此函數將返回相同的〜256。我怎麼能使它colorDistance(黑色,白色)返回256和colorDistance(白色,黑色)返回-256?

我不反對使用HSV/HSL如果這是一個選項,但我更熟悉RGB。如果可以提供用於計算HSV/HSL的正面或負面色彩距離的功能,請將其啓用!

甚至更​​好,另一個簡單的功能,將採取兩種顏色,並簡單地決定是否c1之前或之後c2!

回答

2

您可以通過負1乘以答案,如果:

int pixel = (red & 0xFF) << 24 | 
       (blue & 0xFF) << 16 | 
       (green & 0xFF) << 8 | 
       (255 & 0xFF); // 255 is alpha value 

小於其他顏色的像素。

編輯:我留下alpha值以防將來使用它。如果沒有,那麼你可以將這部分分離出來,並通過減少8每班像這樣:

int pixel = (red & 0xFF) << 16 | 
      (blue & 0xFF) << 8 | 
      (green & 0xFF); 
+0

好的表演,我會試試看。 – Marty 2012-07-12 17:26:26

+0

做過漂亮的朋友。謝謝您的幫助! – Marty 2012-07-12 17:40:34

0

你可以嘗試通過其表示爲十六進制數字使RGB顏色數組,然後通過值列表進行排序。

+0

這不行,在那裏做了。由於RGB是三個獨立的十六進制值組合,因此十六進制數字的順序將與顏色的正確順序不一致。 – Marty 2012-07-12 17:25:39