4

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

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

所以第二种颜色应该比第一种颜色浅 10% 或 20%

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

有什么算法或方法可以实现吗?可能算法会计算出更高的值: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);
}

then you can enlight a color simply by incrementing the v (value) component, and then converting back to RGB if needed with the very same Android API 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 范围内的浮点值,其中 255(或 0xFF)的 int 值对应于 1.0 浮点值。正如我在示例末尾所做的那样,您只需将其与您选择的因子相乘即可。

于 2012-12-11T11:30:38.513 回答