2012-02-22 73 views
1

我有十六進制格式的顏色列表(例如#000000),我想檢測顏色類型(藍色,紅色,綠色等),然後將顏色類型更改爲另一種顏色類型。這是可能的,並有任何框架/庫此任務?Java中的顏色檢測器

實施例:

我有顏色#EB1369(紅色),那麼我將其轉換爲藍色,並且變得例如#1313EB(藍色)。

+0

你怎麼知道#eb1369是紅色的?我的意思是我知道這是事實,但是你想用什麼定義或比色法概念? – ARRG 2012-02-22 12:07:20

+0

如果它看起來紅,那麼它是紅色的:)但我不知道電腦如何檢測顏色類型,所以這就是爲什麼我問這個問題... – newbie 2012-02-22 12:10:53

回答

1

這裏有一個函數可以讓你圍繞色相循環移動顏色。你應該閱讀維基百科頁面上的HSB(或HSV)色彩系統真正明白是怎麼回事:http://en.wikipedia.org/wiki/HSV_color_space

/** Converts an input color given as a String such as "ab451e" to 
* the HSB color space. Shifts its hue from the given angle in degrees. 
* Then returns the new color in the same format it was given. 
* 
* For example shift("ff0000", 180); returns "80ff00" (green is the opposite of red).*/ 
public static String shift(String rgbS, int angle) {   
    // Convert String to integer value 
    int value = Integer.parseInt(rgbS, 16); 

    // Separate red green and blue 
    int r = value >> 16; 
    int g = (value >> 8) & 0xff; 
    int b = value & 0xff; 

    // Convert to hsb 
    float[] hsb = Color.RGBtoHSB(r, g, b, null); 

    // Convert angle to floating point between 0 and 1.0 
    float angleF = (float)(angle/360.0); 

    // Shift the hue using the angle. 
    float newAngle = hsb[0] + angleF; 
    if(newAngle > 1.0) 
     newAngle = newAngle - 1.0f; 
    hsb[0] = newAngle; 

    // Convert back to RGB, removing the alpha component 
    int rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]); 
    rgb = rgb & 0xffffff; 

    // Build a new String 
    return Integer.toHexString(rgb); 
} 

檢測的顏色可以是複雜的,它取決於你真正期望的結果。

如果你想要的只是一個近似值(紅色,綠色,藍色,黃色等),那麼你可以看看HSB色彩空間的色調圈,爲每個你想要定義的顏色選擇一個色調值,然後將輸入的顏色映射到您選擇的最接近的顏色。

你也可以依賴像命名的HTML顏色:http://www.w3schools.com/html/html_colornames.asp。拿這個清單,在你的程序中創建一個映射,然後你所要做的就是將你得到的顏色映射到你地圖上最近的一個,然後返回它的名字。請注意:計算兩種顏色之間的距離可能會非常棘手(特別是在RGB中),而幼稚的方法(例如通道間差異)會產生令人驚訝的不好的結果。比色法是一個複雜的主題,你會發現在這個頁面上的好方法:http://en.wikipedia.org/wiki/Color_difference

1

嘗試將RGB值轉換爲HSV(準確地說,HSB) - 它是用於人類更舒適的顏色的格式。轉換後,所有你需要做的是改變H V(可能) 並將其轉換回RGB。

+0

他需要改變色相(顏色)不是他值(〜=亮度)。還要注意,java的'Color'原生支持HSB,但不支持HSV,因此前者可能更易於使用。 – ARRG 2012-02-22 12:12:49

+0

感謝您解決我的問題:) – IProblemFactory 2012-02-22 12:14:57

0

我想你喜歡將RGB顏色轉換爲HSB。你可以這樣做wuth:

java.awt.Color.RGBtoHSB(...) 

那麼你可以很容易地確定whetther H值爲在你藍色的定義適合,並且將它修改爲任何你喜歡的。在此之後,你可以很容易地通過其轉換回RGB:

java.awt.Color.getHSBColor(...) 

和IFG你不喜歡jawa.awt.color只是transofrmation矩陣乘以顏色矢量。

0

每個HEX顏色都有三個部分,紅色,綠色和藍色#標識一個HEX顏色,下面兩個字母是紅色的量;接下來的兩個是綠色的,接下來的兩個是藍色的。即:RGB

這兩個字母可以具有最大十六進制值FF這是255,最小值00是零。

所以,你可以說這樣的,我想用2層紅色的部分,7個綠色部分和零個藍色部分顏色,它會給你#020700

這就是爲什麼#FFFFFF爲白色(所有的顏色一起)和#000000是黑色的(根本沒有顏色)

有了這個邏輯,你可以以任何你想要的方式修改顏色; Color類也可以幫助很多。