如何从带徽章的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
相关产品推荐
相关产品推荐

