在數組中確定最接近的顏色
比較顏色並識別數組中最接近的匹配是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距離或加權色調,飽和度和亮度比較方法可提供更準確的結果。