颜色插值与线性渐变的比较

如何验证插值方法与微软的线性渐变刷的匹配程度。验证方法仅限于一组小范围的颜色。每次测试有二十种颜色参与。起始和结束颜色是通过颜色对话框选择的。对于每次测试,颜色是从以下渐变中选择的。

验证方法如下: 1. 为测试选择起始和结束颜色。 2. 根据起始和结束颜色填充线性渐变面板。 3. 点击“比较”按钮,计算插值颜色;创建选择颜色按钮,并沿插值渐变面板正确地间隔按钮。

以下是C#语言中的代码片段,用于填充渐变面板和计算插值颜色: bool fill_gradient_PAN() { bool have_colors = (have_end_color && have_start_color); if (have_colors) { gradient_PAN.Visible = true; gradient_PAN.Invalidate(); compare_BUT.Visible = true; } return have_colors; } List get_interpolation_colors(Color start_color, Color end_color, int number_of_colors) { List list = new List(); float count = (float)number_of_colors - 1.0F; float start_R = (float)start_color.R; float difference_R = (start_R - (float)end_color.R) / count; float start_G = (float)start_color.G; float difference_G = (start_G - (float)end_color.G) / count; float start_B = (float)start_color.B; float difference_B = (start_B - (float)end_color.B) / count; for (int i = 0; i < number_of_colors; i++) { int B = MinMax(start_B, difference_B, (float)i); int G = MinMax(start_G, difference_G, (float)i); int R = MinMax(start_R, difference_R, (float)i); list.Add(Color.FromArgb(R, G, B)); } return list; }

为了确保选择颜色按钮的间隔正确,因为按钮的中心线将用于确定线性渐变面板中的颜色与选择颜色按钮的颜色进行比较。现在有足够的信息来执行验证:插值颜色列表中的选择颜色按钮的颜色和直接位于选择颜色按钮上方的线性渐变像素的颜色。

以下是C#语言中的代码片段,用于计算颜色差异: void color_difference(Color pixel_color, Color interpolation_color, ref int difference, ref Color difference_color) { difference = 0; difference_color = Color.Empty; if (interpolation_color.R != pixel_color.R) { difference++; } if (interpolation_color.G != pixel_color.G) { difference++; } if (interpolation_color.B != pixel_color.B) { difference++; } if (difference == 0) { difference_color = Color.LightGreen; } else if (difference > 1) { difference_color = Color.Red; } else { difference_color = Color.Yellow; } }

如果组件相等,则差异框的背景颜色为LightGreen;如果一个组件不同,则背景颜色为Yellow;如果两个或更多组件不同,则背景颜色为Red。在所有情况下,显示差异框文本的差异组件计数。

所有测试的结果如下。请注意,每个图形都是一个缩略图,点击后会显示更大的图形。在完美的世界里,差异框的背景颜色都将是LightGreen。由于情况并非如此,必须找出原因。

应该首先考虑的是按钮在渐变面板下方的位置。这些按钮的颜色不依赖于渐变面板中的颜色(与软件第一版中使用的算法不同)。相反,按钮颜色依赖于插值计算的结果。

按钮的位置是通过整数计算确定的。因此,四舍五入可能成为一个因素,特别是因为按钮中心线的横向位置是使用除法计算的。因此,使用浮点算术重新计算了间距。

以下是C#语言中的代码片段,用于计算初始间距: int spacing = (int)(((float)(interpolation_button_PAN.Size.Width - (BUTTON_WIDTH * number_of_colors)) / (float)(number_of_colors - 1)) + 0.5F);

尽管这一变化改善了结果(更多的差异框的背景颜色为LightGreen),但仍然有差异框的背景颜色为Yellow和Red。这导致了一个假设,即渐变面板中像素的位置略微向左或向右偏离了相应的选择颜色按钮的中心线。

为了测试这个假设,程序被修改为允许使用箭头键将按钮的中心线向左和向右移动。首先点击感兴趣的选择颜色按钮。这会导致选中按钮和相关报告项的边框被突出显示。

现在按下左键和/或右键,直到差异框的背景颜色为LightGreen。更正框显示移动的像素数和移动方向(向左为粉红色;向右为淡绿色)。在这个例子中,选择颜色按钮的中心线应该向左移动2像素。

以下是所有6次测试的结果。在6次测试中的5次中,简单地重新定位选择颜色按钮就足以使线性渐变颜色与插值颜色匹配。尽管有些人可能会认为应该自动应用更正,但蓝/紫面板表明并非如此。在蓝/紫测试中,似乎没有任何简单的左右移动可以纠正选择颜色按钮的位置。

还要注意,人类对插值和线性渐变颜色之间差异的感知是非常小的。

如果接受人类感知作为一个因素,那么“插值方法与微软的线性渐变刷匹配得如何?”这个问题可以回答为“非常好”。

本文讨论了插值颜色与线性颜色渐变的使用。这项研究的结果表明,两者之间的差异非常小。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485