在数组中确定最接近的颜色
比较颜色并识别数组中最接近的匹配是Graphics应用程序中的常见任务。在本文中,我们将探讨三种不同的方法来实现这一目标:
1。仅在色调的比较:
此方法仅考虑颜色的色调,忽略饱和度和亮度。色相距离是使用简单的减法来计算的,最接近的色调是通过找到最小距离来确定的。
2。 rgb距离:
此方法测量颜色的RGB值之间的直接距离。色差被计算为RGB空间中的欧几里得距离,通过最小化此差异,可以找到最接近的颜色。
以加权方式结合了色相,饱和度和亮度。计算感知的亮度,并根据饱和度和亮度计算颜色数。最接近的颜色是通过最小化色差和色相距离的加权总和来确定的。
实现这是这些方法的实现:[&& && pranly比较
int ClosestColor1(List 颜色,颜色目标)
{
var hue1 = target.gethue();
var diffs = colors.Select(n => gethuedistance(n.gethue(),hue1));
var diffmin = diffs.min(n => n);
返回diffs.tolist()。findIndex(n => n == diffmin);
}
// RGB距离比较
Int ClosestColor2(List 颜色,颜色目标)
{
var colordiffs = colors.Select(n => colordiff(n,target))。min(n => n);
返回colors.findIndex(n => colordiff(n,target)== colordiffs);
}
//加权色调,饱和度和亮度比较
Int ClosestColor3(List 颜色,颜色目标)
{
float hue1 = target.gethue();
var num1 = colorrum(target);
var diffs = colors.Select(n => Math.abs(colornum(n)-Num1)gethuedistance(n.gethue(),hue1));
var diffmin = diffs.min(x => x);
返回diffs.tolist()。findIndex(n => n == diffmin);
} [2
float getbrightness(颜色c)=>(c.r * 0.299f c.g * 0.587f c.b * 0.114f) / 256f;
//两种色调之间的距离:
float gethuedistance(float hue1,float hue2)=> math.abs(hue1 -hue2)> 180? 360 -MATH.ABS(HUE1 -HUE2):MATH.ABS(hue1 -hue2);
//通过饱和和亮度称量:
float colornum(颜色c)=> c.getSaturation() *因子at getbrightness(c) * factorbri;
// RGB空间中的距离:
int colordiff(颜色C1,颜色C2)=>(int)MATH.SQRT(((C1.R -C2.R) *(C1.R -C2.R)(C1.G -C2.G) *(C1.G -C2.G)(C1.B -C2.G)(C1.B -C2.B)度量取决于特定应用。如果色调是主要考虑因素,则只有色调的比较就足够了。对于更通用的颜色匹配,RGB距离或加权色调,饱和度和亮度比较方法可提供更准确的结果。