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

如何从带徽章的GIcon获取GdkPixbuf?

将GEmblemedIcon转换为GdkPixbuf的解决方案

要把你创建的带徽章的GEmblemedIcon转换成GdkPixbuf,核心是通过GtkIconTheme获取对应的GtkIconInfo,再加载为像素缓冲区。具体实现代码如下:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    // 创建带徽章的GIcon(你的原有代码)
    GIcon *icon = g_themed_icon_new("folder");
    GIcon *emblem_icon = g_themed_icon_new("emblem_symbolic_link");
    GEmblem *emblem = g_emblem_new(emblem_icon);
    GIcon *emblemed = g_emblemed_icon_new(icon, emblem);

    // 获取默认图标主题
    GtkIconTheme *icon_theme = gtk_icon_theme_get_default();
    // 指定想要的图标尺寸(比如48x48),可根据需求调整
    gint icon_size = 48;
    // 查找对应的GtkIconInfo
    GtkIconInfo *icon_info = gtk_icon_theme_lookup_by_gicon(
        icon_theme,
        emblemed,
        icon_size,
        GTK_ICON_LOOKUP_FORCE_SIZE // 强制使用指定尺寸,避免自动缩放
    );

    GdkPixbuf *pixbuf = NULL;
    GError *error = NULL;
    if (icon_info != NULL) {
        // 加载为GdkPixbuf
        pixbuf = gtk_icon_info_load_icon(icon_info, &error);
        if (error != NULL) {
            g_printerr("加载图标失败: %s\n", error->message);
            g_error_free(error);
        }
        // 使用pixbuf做你需要的操作,比如显示、保存等
        if (pixbuf != NULL) {
            g_print("成功获取Pixbuf,尺寸:%dx%d\n",
                    gdk_pixbuf_get_width(pixbuf),
                    gdk_pixbuf_get_height(pixbuf));
        }
        // 释放GtkIconInfo
        g_object_unref(icon_info);
    } else {
        g_printerr("找不到对应的图标信息\n");
    }

    // 释放所有创建的GObject资源
    g_object_unref(emblemed);
    g_object_unref(emblem);
    g_object_unref(emblem_icon);
    g_object_unref(icon);
    if (pixbuf != NULL) {
        g_object_unref(pixbuf);
    }

    return 0;
}

关键步骤说明

  • 获取GtkIconTheme:调用gtk_icon_theme_get_default()获取系统默认的图标主题,也可以用gtk_icon_theme_new()创建自定义主题实例。
  • 查找GtkIconInfo:gtk_icon_theme_lookup_by_gicon()直接接收GIcon对象(包括GEmblemedIcon),不需要单独处理徽章,GTK会自动合并徽章与基础图标。
  • 加载Pixbuf:gtk_icon_info_load_icon()负责将图标渲染为GdkPixbuf,记得处理可能的错误。

关于GtkImage的补充

如果你之前尝试用GtkImage没成功,可能是没指定图标尺寸或正确的加载方式,也可以用以下方式尝试:

GtkWidget *image = gtk_image_new_from_gicon(emblemed, GTK_ICON_SIZE_DIALOG);
GdkPixbuf *pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image));

不过这种方式依赖GtkWidget的创建,不如直接用图标主题查找的方式灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:47:49