You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gtk3绘图区域显示rgb(248,205,205,1)线性渐变?

如何在Gtk3的Cairo绘图区域正确显示rgb(248,205,205)的线性渐变?

我尝试使用rgba(248, 205, 205, 1)绘制线性渐变图案,曾在GtkColorChooserWidget中看到过rgb(248, 205, 205)的线性渐变效果。但当我使用Cairo在Gtk3绘图区域绘制该渐变时,却无法正常显示(呈现黑色)。请问如何正确显示rgb(248, 205, 205, 1)的线性渐变?

GtkColorChooserWidget中的渐变效果

相关代码示例:

#include <cairo.h>
#include <gtk/gtk.h>

void draw_gradient2(cairo_t *);
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data){         
  draw_gradient2(cr);
  return FALSE;
}

void draw_gradient2(cairo_t *cr){
    int width = 400;
    int height = 50;

    cairo_pattern_t *gradient;
    gradient =cairo_pattern_create_linear(0.0, 0.0,  width, 0.0);
    cairo_pattern_add_color_stop_rgba (gradient, 0.0, 248/256, 205/256, 205/256, 0.3);
    cairo_pattern_add_color_stop_rgba (gradient, 1.0, 248/256, 205/256, 205/256, 1);

    cairo_set_source (cr, gradient);
    cairo_paint (cr);
    cairo_pattern_destroy (gradient);
}

int main(int argc, char *argv[]){
  GtkWidget *window;
  GtkWidget *darea;  

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  darea = gtk_drawing_area_new();
  gtk_container_add(GTK_CONTAINER (window), darea);

  g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL);  
  g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);

  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 400, 50); 
  gtk_window_set_title(GTK_WINDOW(window), "Linear gradients");

  gtk_widget_set_app_paintable(window, TRUE);
  gtk_widget_show_all(window);

  gtk_main();
  return 0;
}

问题原因与解决方法

问题出在整数除法上。C语言中,两个整数相除会直接截断小数部分,比如248/256的计算结果是0,而非预期的0.96875。所有颜色通道值都被算成0,最终渐变自然显示为黑色。

只需要将除法运算改为浮点除法即可解决:把分子或分母改为浮点数形式(比如在数字后加.0),让编译器执行浮点运算。

修正后的draw_gradient2函数:

void draw_gradient2(cairo_t *cr){
    int width = 400;
    int height = 50;

    cairo_pattern_t *gradient;
    gradient = cairo_pattern_create_linear(0.0, 0.0, width, 0.0);
    // 将整数除法改为浮点除法
    cairo_pattern_add_color_stop_rgba(gradient, 0.0, 248.0/256, 205.0/256, 205.0/256, 0.3);
    cairo_pattern_add_color_stop_rgba(gradient, 1.0, 248.0/256, 205.0/256, 205.0/256, 1);

    cairo_set_source(cr, gradient);
    cairo_paint(cr);
    cairo_pattern_destroy(gradient);
}

你也可以直接使用计算好的浮点值(比如0.96875对应248/256,0.8039对应205/256),效果是一样的。


内容的提问来源于stack exchange,提问作者dibyendu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:01:18