2012-02-22 7 views
1

色のリスト(たとえば#000000)があり、色の種類(青、赤、緑など)を検出してから別の色の種類に変更したいと思います。これは可能ですか?このタスクのためのフレームワーク/ライブラリはありますか?Javaの色検出器

例:

Iは、私は青に変換し、それは、例えば#1 1313EB(青)のためになるカラー#EB1369(赤色)を有します。

+0

#eb1369が赤であることをどのように知っていますか?私はそれがあることを知っていることを意味しますが、どのような定義や測色コンセプトを使用したいですか? – ARRG

+0

赤色に見える場合、それは私にとっては赤です:)しかし、コンピュータがどのように色の種類を検出できるのかわからないので、私はそれについて質問しています... – newbie

答えて

1

ここでは色相環の周りの色を移動させる機能があります。あなたは本当に何が起こっているか理解するためにHSB(またはHSV)カラーシステム上のWikipediaのページをお読みください: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などを使用することもできます。このリストを取得し、プログラムでマッピングを作成します。次に、取得した色をマップ内の最も近い色にマップし、その名前を返します。ただし、2つの色の間の距離を計算するのは難しい(特にRGBでは)場合があり、単純なアプローチ(チャネルごとの違いなど)は驚くほど悪い結果をもたらす可能性があります。測色は複雑なトピックで、このページでは良い方法を見つけることができます:http://en.wikipedia.org/wiki/Color_difference

1

RGB値をHSV(正確にはHSB)に変換してみてください - 人間にとってより快適な色のフォーマットです。変換後は、H V(おそらく) を変更してRGBに変換し直す必要があります。

+0

彼は色相を変更する必要があります色)ではない値(〜=明るさ)。また、javaの 'Color'はネイティブでHSBをサポートしますがHSVはサポートしないので、前者は使いやすくなることに注意してください。 – ARRG

+0

修正ありがとうございました:) – IProblemFactory

0

私はあなたがHSBにRGB色を変換したいと思います。このwuthを行うことができます。

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

、あなたは簡単にHの値は青のあなたの定義に収まるwhetther決定し、何が好きにそれを修正することができます。この後、あなたは簡単に介して、RGBに戻し、それを変換することができます:

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

そして、あなたはちょうどtransofrmationマトリクスによって色ベクトルを乗算jawa.awt.color好きではありませんIFG。

0

各HEXカラーには赤、緑、青の3つの部分があり、#はHEXカラーを示し、次の2文字は赤の量です。次の2つは緑色で、次の2つは青色です。すなわち、RGB

の最大16進値は255であり、最小値は0,で、ゼロであることができます。

あなたはこのように主張することができますので、私は#FFFFFFは(一緒にすべての色)白である理由であるあなたに#020700

を与える2つの赤の部分、7つの緑の部分、およびゼロ青い部分、と色をしたいです#000000は黒です(色はまったくありません)

このロジックでは、任意の方法で色を変更できます。 Colorクラスも多くの助けになります。

関連する問題