c的颜色渐变

  • 本文关键字:渐变 颜色 c
  • 更新时间 :
  • 英文 :


我在C中迈出了第一步,并试图制作一个渐变颜色函数,它在屏幕上(垂直)绘制了一堆矩形。这是到目前为止的代码:

void draw_gradient(uint32_t start_color, uint32_t end_color) {
int steps = 8;
int draw_height = window_height / 8;

//Change this value inside the loop to write different color
uint32_t loop_color = start_color;
for (int i = 0; i < steps; i++) {
draw_rect(0, i * draw_height, window_width, draw_height, loop_color);
}
}

现在忽略end_color,我想尝试传递一个简单的红色,如0xFFFF0000(ARGB)..然后采取红色的'FF',并将其转换为整数或减少它使用loop_color变量。

我不知道如何从十六进制中获得红色值,然后将其作为一个数字,然后将其写回十六进制…任何想法?

因此,在8步中,代码应该以十六进制形式从FF00或从2550的整数形式进行。

正如你所说的,你的颜色是RGB格式的。此计算假设垂直梯度-即从上到下(线性线)。

步骤如下:

  • 获取要绘制的线条数;这是你的矩形高度
  • 从开始和结束颜色中获取A, R, G, B颜色组件
uint8_t start_a = start_color >> 24;
uint8_t start_r = start_color >> 16;
uint8_t start_g = start_color >> 8;
uint8_t start_b = start_color >> 0;
uint8_t end_a = end_color >> 24;
uint8_t end_r = end_color >> 16;
uint8_t end_g = end_color >> 8;
uint8_t end_b = end_color >> 0;
  • 计算每个组件的步长
float step_a = (float)(end_a - start_a) / (float)height;
float step_r = (float)(end_r - start_r) / (float)height;
float step_g = (float)(end_g - start_g) / (float)height;
float step_b = (float)(end_b - start_b) / (float)height;
  • 运行for循环并为每种颜色应用不同的步骤
for (int i = 0; i < height; ++i) {
uint32_t color = 0 |
((start_a + i * step_a) & 0xFF) << 24 |
((start_r + i * step_r) & 0xFF) << 16 |
((start_g + i * step_g) & 0xFF) << 8 |
((start_b + i * step_b) & 0xFF) << 0
draw_horizontal_line(i, color);
}

对于step_x最好使用float,并在每次迭代中使用乘法/加法。否则,使用整数四舍五入时,您可能永远不会增加number,因为它总是被四舍五入。

相关内容

  • 没有找到相关文章

最新更新