比較顏色並識別數組中最接近的匹配是圖形應用程式中的常見任務。在本文中,我們將探討三種不同的方法來實現此目的:
1。僅色調比較:
此方法只考慮顏色的色調,忽略飽和度和亮度。使用簡單的減法計算色相距離,透過找到最小距離來確定最接近的色相。
2. RGB 距離:
此方法測量顏色的 RGB 值之間的直接距離。色差計算為 RGB 空間中的歐幾里德距離,並透過最小化此差異來找到最接近的顏色。
3.加權色相、飽和度和亮度比較:
此方法以加權方式組合色相、飽和度和亮度。計算感知亮度,並根據飽和度和亮度計算色數。透過最小化色差和色調距離的加權和來確定最接近的顏色。
以下是這些方法的實現:
// Hue-Only Comparison int closestColor1(List<Color> colors, Color target) { var hue1 = target.GetHue(); var diffs = colors.Select(n => getHueDistance(n.GetHue(), hue1)); var diffMin = diffs.Min(n => n); return diffs.ToList().FindIndex(n => n == diffMin); } // RGB Distance Comparison int closestColor2(List<Color> colors, Color target) { var colorDiffs = colors.Select(n => ColorDiff(n, target)).Min(n => n); return colors.FindIndex(n => ColorDiff(n, target) == colorDiffs); } // Weighted Hue, Saturation, and Brightness Comparison int closestColor3(List<Color> colors, Color target) { float hue1 = target.GetHue(); var num1 = ColorNum(target); var diffs = colors.Select(n => Math.Abs(ColorNum(n) - num1) + getHueDistance(n.GetHue(), hue1)); var diffMin = diffs.Min(x => x); return diffs.ToList().FindIndex(n => n == diffMin); }
// Color brightness as perceived: float getBrightness(Color c) => (c.R * 0.299f + c.G * 0.587f + c.B * 0.114f) / 256f; // Distance between two hues: float getHueDistance(float hue1, float hue2) => Math.Abs(hue1 - hue2) > 180 ? 360 - Math.Abs(hue1 - hue2) : Math.Abs(hue1 - hue2); // Weighed by saturation and brightness: float ColorNum(Color c) => c.GetSaturation() * factorSat + getBrightness(c) * factorBri; // Distance in RGB space: int ColorDiff(Color c1, Color c2) => (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R) + (c1.G - c2.G) * (c1.G - c2.G) + (c1.B - c2.B) * (c1.B - c2.B));
顏色的選擇距離度量取決於具體應用。如果色調是主要考慮因素,則僅進行色調比較就足夠了。對於更一般的顏色匹配,RGB 距離或加權色調、飽和度和亮度比較方法可提供更準確的結果。
以上是如何在顏色數組中找到最接近的顏色?的詳細內容。更多資訊請關注PHP中文網其他相關文章!