2012-06-21 118 views
0

我正在使用java來查找圖像中對象的顏色。 我已經從imgae獲得一個像素,然後能夠獲得該像素的r,g,b值。從java中的十六進制代碼獲取顏色名稱

現在,我想知道這個像素屬於哪種顏色。所以我創建了一個將十六進制代碼映射到color_names的映射。現在,我遍歷地圖,並找出地圖中所有條目的最短距離,並將距離最小的一個條目映射到將該顏色分配給像素的像素。

下面是我的一些代碼: -

private static String getColorName(int[] rgb) { 
    Map<String, String> data = new HashMap<String, String>(); 
    data.put("00ff00", "GREEN"); 
    data.put("ff0000", "RED"); 
    data.put("0000ff", "BLUE"); 

    data.put("00ffff", "CYAN"); 
    data.put("ffff00", "YELLOW"); 
    data.put("ff00ff", "PINK"); 

    data.put("c8c8c8", "LIGHT GREY"); 
    //data.put("808080", "GREY"); 
    data.put("ffc800", "ORANGE"); 
    data.put("4F3E86", "PURPLE"); 

    data.put("000000", "BLACK"); 
    data.put("ffffff", "WHITE"); 

    String hex = "abcdef"; 

    int minD = 256*256*256; 
    String res = ""; 

    for (String key : data.keySet()) { 
     int r = hex.indexOf(key.charAt(0))*16 + hex.indexOf(key.charAt(1)); 
     int g = hex.indexOf(key.charAt(2))*16 + hex.indexOf(key.charAt(3)); 
     int b = hex.indexOf(key.charAt(4))*16 + hex.indexOf(key.charAt(5)); 

     int distance = (Math.abs(rgb[0] - r)) + 
       (Math.abs(rgb[1] - g)) + 
       (Math.abs(rgb[2] - b)); 

     if (distance < minD) { 
      res = data.get(key); 
      minD = distance; 
     } 
    } 
    return res; 
} 

現在的問題是,

正如你可以看到距離函數是: - d = | R1-R2 | + | g1-g2 | + | b1-b2 |其中| x |指示abs(x)功能 我的黃色被映射爲灰色。經過一些調試後,我發現這一點。 我應該選擇什麼距離函數或如何改進我的映射?

在java中這樣做是否存在任何內置的東西? 謝謝進階

+1

你只是試圖讓[Web安全顏色(HTTP:// en.wikipedia.org/wiki/Web_colors#Web-safe_colors)? – Makoto

+1

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。熱鏈接到一個小(以字節爲單位)的圖像或在內存中生成一個。 –

+0

我只想指出它看起來紅色或看起來黃色的像素。我只想使用常用的10-15種顏色。 – sachinjain024

回答

0

顏色都有一個構造函數RGB值,所以:

g.setColor(new Color(0x00, 0x00, 0xff)); 

來源是:Class Color

+0

這裏的g是什麼? – sachinjain024

+0

'g'可能代表[''Graphics'](http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html)實例 - 這意味着這個答案會錯過點你的問題,這是關於如何確定顏色的子集,無論是表示爲整數或十六進制。 –

相關問題