我有十六進制格式的顏色列表(例如#000000),我想檢測顏色類型(藍色,紅色,綠色等),然後將顏色類型更改爲另一種顏色類型。這是可能的,並有任何框架/庫此任務?Java中的顏色檢測器
實施例:
我有顏色#EB1369(紅色),那麼我將其轉換爲藍色,並且變得例如#1313EB(藍色)。
我有十六進制格式的顏色列表(例如#000000),我想檢測顏色類型(藍色,紅色,綠色等),然後將顏色類型更改爲另一種顏色類型。這是可能的,並有任何框架/庫此任務?Java中的顏色檢測器
實施例:
我有顏色#EB1369(紅色),那麼我將其轉換爲藍色,並且變得例如#1313EB(藍色)。
這裏有一個函數可以讓你圍繞色相循環移動顏色。你應該閱讀維基百科頁面上的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
嘗試將RGB值轉換爲HSV(準確地說,HSB) - 它是用於人類更舒適的顏色的格式。轉換後,所有你需要做的是改變H
V(可能)
並將其轉換回RGB。
他需要改變色相(顏色)不是他值(〜=亮度)。還要注意,java的'Color'原生支持HSB,但不支持HSV,因此前者可能更易於使用。 – ARRG 2012-02-22 12:12:49
感謝您解決我的問題:) – IProblemFactory 2012-02-22 12:14:57
我想你喜歡將RGB顏色轉換爲HSB。你可以這樣做wuth:
java.awt.Color.RGBtoHSB(...)
那麼你可以很容易地確定whetther H值爲在你藍色的定義適合,並且將它修改爲任何你喜歡的。在此之後,你可以很容易地通過其轉換回RGB:
java.awt.Color.getHSBColor(...)
和IFG你不喜歡jawa.awt.color只是transofrmation矩陣乘以顏色矢量。
每個HEX顏色都有三個部分,紅色,綠色和藍色#
標識一個HEX顏色,下面兩個字母是紅色的量;接下來的兩個是綠色的,接下來的兩個是藍色的。即:RGB
這兩個字母可以具有最大十六進制值FF
這是255,最小值00
是零。
所以,你可以說這樣的,我想用2層紅色的部分,7個綠色部分和零個藍色部分顏色,它會給你#020700
這就是爲什麼#FFFFFF
爲白色(所有的顏色一起)和#000000
是黑色的(根本沒有顏色)
有了這個邏輯,你可以以任何你想要的方式修改顏色; Color
類也可以幫助很多。
你怎麼知道#eb1369是紅色的?我的意思是我知道這是事實,但是你想用什麼定義或比色法概念? – ARRG 2012-02-22 12:07:20
如果它看起來紅,那麼它是紅色的:)但我不知道電腦如何檢測顏色類型,所以這就是爲什麼我問這個問題... – newbie 2012-02-22 12:10:53