4

たとえば、私は1つの色を持っています0xFF0000。この色だけを始点情報として、簡単なグラデーションを作りたいです。2点目は1色目より明るい色になります。

たとえば、価値が0xFF0000あり、それから取得したい場合など0xCC0000です。次に、単純なグラデーションを描画できます。

したがって、2 番目の色は、最初の色よりも 10 または 20% 明るくする必要があります。

ハードコード値は受け入れられません。ユーザーがカラー ホイールから色を選択すると、アプリケーションは単純なグラデーションを描画するための 2 番目の色を自動的に生成する必要があります。

これを実装するアルゴリズムまたは方法はありますか? おそらくアルゴリズムは、R、G、または B のどちらが高いかをカウントし、その後、他のコンポーネントまたは何かを並行して減少させます...これがどのように機能するかはわかりません。

PS: Android SDK を使用しています

4

3 に答える 3

4

RGBからHSV空間に変換するのが最善だと思います:

public int enlight(int color, float amount) {
  float[] hsv = new float[3];
  Color.colorToHSV(color, hsv);
  hsv[2] = Math.min(1.0f, amount * hsv[2]);
  return Color.HSVToColor(hsv);
}

次に、(値)コンポーネントをインクリメントするだけで色を啓発vし、必要に応じてまったく同じ Android API を使用して RGB に戻すことができます。Color

于 2012-12-11T11:34:21.243 に答える
0

次のようなもののようです:

int red     = Color.red(color);
int green   = Color.green(color);
int blue    = Color.blue(color);

int secondColor = 0;
int lighting    = 51; // from 0 to 255. The larger the number is the brighter second color

if (red > green && red > blue)
    secondColor = Color.rgb(red, green - lighting, blue - lighting);
else if (green > red && green > blue)
    secondColor = Color.rgb(red - lighting, green, blue - lighting);
else if (blue > red && blue > green)
    secondColor = Color.rgb(red - lighting, green - lighting, blue);

すべての色でテストする必要があります...


アップデート:

それは機能しますが、緑と青が等しいか、赤と青が等しいかどうかを確認するには、他の条件を設定する必要があります.. @Raffaeleの回答をフォローしてください

于 2012-12-11T11:30:36.220 に答える
0

getRGBColorComponents()Color クラスのメソッドを利用して、可能な方法を示す簡単な例を作成しました。

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame {

public Test(Color c1, Color c2) {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(200, 200);
    setVisible(true);
    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    panel.add(new JLabel(createColorIcon(c1)));
    panel.add(new JLabel(createColorIcon(c2)));
    add(panel);
}

public ImageIcon createColorIcon(Color c) {
    int w = 44, h = 20;
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bi.createGraphics();
    if (c != null) {
        g.setColor(c);
        g.fillRect(0, 0, w, h);
    } else {
        g.setColor(Color.GRAY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawLine(1, 1, w - 2, h - 2);
        g.drawLine(1, h - 2, w - 2, 1);
    }
    g.setColor(Color.GRAY);
    g.drawRect(0, 0, w - 1, h - 1);
    g.dispose();
    return new ImageIcon(bi);
}

public static void main(String[] args) {

    Color c1 = Color.decode("0xFF0000");
    float[] f = c1.getRGBColorComponents(null);
    System.out.println(f.length);
    for (int i = 0; i < f.length; i++) {
        System.out.println(f[i]);
    }
    f[0] = f[0] * 0.8f;
    Color c2 = new Color(f[0],f[1],f[2]);
    new Test(c1,c2);

}

}

メソッドを呼び出すだけgetRGBColorComponents()で、赤、緑、青の色の値を 0.0 から 1.0 の範囲の float 値として持つ配列を取得します。ここで、255 (または 0xFF) の int 値は 1.0 の float 値に対応します。例の最後で作成したように、選択した係数を掛けるだけです。

于 2012-12-11T11:30:38.513 に答える