仅使用一种颜色生成渐变

时间:2012-12-11 11:08:18

标签: java android colors rgb

我有一种颜色,例如0xFF0000。我想仅使用此颜色作为起点信息来创建简单渐变。第二点将是第一种颜色较浅的颜色。

例如,如果我有价值 - 0xFF0000,我想从中获取0xCC0000。然后我可以绘制简单的渐变。

所以第二种颜色应该是,例如比第一种颜色轻10或20%

不接受硬代码值。用户将从色轮中选择颜色,应用程序应自动生成第二种颜色以绘制简单的渐变。

有没有算法或方法来实现这个? 可能算法将计算更高的值:R或G或B然后并行减少其他组件,或者某种东西......我不确定它是如何工作的。

P.S。:我正在使用android SDK

3 个答案:

答案 0 :(得分:4)

我认为最好的是从RGB转换为the HSV space

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 Color <转换回RGB,就可以 enlight 一种颜色/ p>

答案 1 :(得分: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回答

答案 2 :(得分:0)

我做了一个简单的例子,向您展示了一种可能的方法,它使用了Color类的getRGBColorComponents()方法。

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,其中int值为255(或0xFF)对应到1.0浮点值。你只需要用你选择的因子来乘以它,就像我在例子末尾所做的那样。