有没有人遇到过选择特定颜色的随机色调的方法?听起来很傻,但我想要做的是想出一种自动生成图表系列颜色的方法,这些颜色需要打上标签。因此,有一种方法可以为特定颜色范围生成一系列颜色值似乎是合理的;我在网上有一些例子,但不是逻辑。
所以我正在寻找一种说法:生成红色,橙色或绿色等的阴影列表。“那么,什么构成'绿色'?”好吧也许如果我提供十六进制值,库/类可以确定它是绿色,然后生成其他绿色的列表等。这样,在渲染图表之前,我可以说“这个品牌使用了一种颜色使用大量蓝调的方案,随机选择蓝色类型的系列颜色。“那有意义吗?这是在C#或Javascript中会有所帮助。
我宁愿了解如何自己构建一个,但是如果已经存在任何库,那将会有所帮助。
答案 0 :(得分:8)
<强> jsBin demo 强>
我能想到的最简单的方法:
使用hsl
(色相,饱和度,亮度)颜色
范围表示如下:
hsl([0-360], [0-100]%, [0-100]%)
HUE SATUR. LIGHT.
将 Hue 视为 360°轮,其中0和360为红色,在您之间拥有所有其他 强>:
现在你可以从那个轮子中检索12个 基本颜色 以30°的步幅移动:
0% : RED
30% : ORANGE
60% : YELLOW
90% : CHARTREUSE GREEN
120%: GREEN
150%: TURQUOISE
180%: CYAN
210%: AZURE
240%: BLUE
270%: VIOLET
300%: MAGENTA
330%: ROSE
您可以随机或通过(即)20%步长生成一些亮度和饱和度的步骤。
饱和度:亮度为50%并将饱和度设置为0%,您将获得与纯灰色完全相同的效果(HEX: #808080
RGB:rgb(128,128,128)
*Wiki: Middle Gray )因此将饱和度视为灰色到全彩的单位。
亮度,范围从0%为黑色到100%为白色 - 应用于所选颜色。
(从逻辑上讲,你可以得出结论,亮度也影响饱和度。)
让我们把上面的内容放在一起!
var numOfShades = 20; // Set here the Desired number of Shades
var colorSELECT = document.getElementById('color');
var colorsDIV = document.getElementById('shades');
function rand(min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function createSPAN( hsl ){
var span = document.createElement('span');
span.style.backgroundColor = hsl;
colorsDIV.appendChild(span);
}
function generateShades(){
colorsDIV.innerHTML = ""; // Empty from old SPANS
var hue = this.value; // The Select Value: 0->360
createSPAN("hsl("+hue+", 100%, 50%)"); // Create The selected color!
for(var i=0; i<numOfShades; i++){ // Create shades!
var hsl = "hsl("+hue+", "+ rand(10,90) +"%, "+rand(10, 90) +"%)";
createSPAN( hsl );
}
}
colorSELECT.onchange = generateShades;
#shades > span{
display:inline-block;
margin:10px;
width:60px;
height:60px;
border-radius:5px;
}
<select id="color">
<option value="0"> RED</option>
<option value="30">ORANGE</option>
<option value="60">YELLOW</option>
<option value="90">CHARTREUSE GREEN</option>
<option value="120">GREEN</option>
<option value="150">TURQUOISE</option>
<option value="180">CYAN</option>
<option value="210">AZURE</option>
<option value="240">BLUE</option>
<option value="270">VIOLET</option>
<option value="300">MAGENTA</option>
<option value="330">ROSE</option>
</select>
<div id="shades"></div>
最后的想法是,您可以改为使用colorWheel图像(就像我上面提供的那样),跟踪点击坐标并使用一些简单的三角函数检索相应的度数,而不是<select>
。您可以使用hsl
颜色。
答案 1 :(得分:0)
以下是一个示例:创建一个带有面板,标签和轨迹栏的表单,并将轨迹栏的最大值设置为360.
private void panel1_Paint(object sender, PaintEventArgs e)
{
float stepX = panel1.ClientSize.Width / 100f;
float stepY = panel1.ClientSize.Height / 100f;
for (int y = 1; y <= 100; y++)
for (int x = 1; x <= 100; x++)
{
HSV hsv = new HSV(trackBar1.Value, x / 100f, y / 100f );
using (SolidBrush brush = new SolidBrush(ColorFromHSV(hsv)))
e.Graphics.FillRectangle(brush,
new RectangleF(x * stepX, y * stepY, stepX, stepY));
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
panel1.Invalidate();
label1.Text = trackBar1.Value.ToString() + "°";
}
public struct HSV
{
public float h; public float s; public float v;
public HSV(float h_, float s_, float v_) { h = h_; s = s_; v = v_; }
}
static public Color ColorFromHSV(HSV hsv)
{
int hi = Convert.ToInt32(Math.Floor(hsv.h / 60)) % 6;
double f = hsv.h / 60 - Math.Floor(hsv.h / 60);
double value = hsv.v * 255;
int v = Convert.ToInt32(value);
int p = Convert.ToInt32(value * (1 - hsv.s));
int q = Convert.ToInt32(value * (1 - f * hsv.s));
int t = Convert.ToInt32(value * (1 - (1 - f) * hsv.s));
if (hi == 0)
return Color.FromArgb(255, v, t, p);
else if (hi == 1)
return Color.FromArgb(255, q, v, p);
else if (hi == 2)
return Color.FromArgb(255, p, v, t);
else if (hi == 3)
return Color.FromArgb(255, p, q, v);
else if (hi == 4)
return Color.FromArgb(255, t, p, v);
else
return Color.FromArgb(255, v, p, q);
}
注意:
你所做的很多事情将取决于你想去的地方..
我希望你能玩得开心!
以下是结果的两个屏幕截图: