【问题标题】:How to compile an image file as icon into an EXE using GTK+ as GUI?如何使用 GTK+ 作为 GUI 将图像文件作为图标编译成 EXE?
【发布时间】:2014-06-09 06:19:21
【问题描述】:

我知道如何将图像设置为 GtkWindow 的图标。

GtkWindow * window;
gtk_window_set_icon_from_file(window, "icon.png", NULL);

并将 icon.png 与 exe 放在一起。

但是如果我不想将该图像文件保留在我的文件夹中,该怎么办?我希望它以某种方式捆绑在 exe 文件中。

我知道这可以通过 Qt 中的 qrc 来完成。我也可以在 GTK+ 中执行此操作吗?

【问题讨论】:

    标签: gtk


    【解决方案1】:

    我现在知道该怎么做了。

    首先,我必须将该图像转换为纯代码。

    假设我想将icon.png 设为图标。

    运行此命令将其转换为名为@9​​87654323@ 的变量。如果没有,请获取该二进制文件。

    gdk-pixbuf-csource --raw --name=icon_1 icon.png
    

    它将显示在命令提示符上。但我想你想把它保存到一个文件中。所以

    gdk-pixbuf-csource --raw --name=icon_1 icon.png>icon.c
    

    将在 Windows 中完成这项工作。

    现在变量icon_1 可以使用了。

    下一步。调用gdk_pixbuf_new_from_inline() 以从icon_1 创建一个新的GdkPixbuf *

    GdkPixbuf * icon_title = gdk_pixbuf_new_from_inline(-1, icon_1, false, NULL);
    

    您现在可以使用新创建的icon_title 调用gtk_window_set_icon() 来设置窗口的图标。

    gtk_window_set_icon(window, icon_title);
    

    还请记住,如果您将 icon_1 保存在独立的 C 文件中,则必须包含 glib.h 以便可以编译它,因为它使用类型 guint8,并在使用之前将该变量 extern 以便它可以链接。

    更多细节:

    https://developer.gnome.org/gdk-pixbuf/unstable/gdk-pixbuf-Image-Data-in-Memory.html#gdk-pixbuf-new-from-inline

    【讨论】:

    • 这已经被弃用了一段时间
    【解决方案2】:

    使用GResource

    .gresource.xml 示例可能如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <gresources>
        <gresource prefix="/com/example/myapp">
            <file>icon.png</file>
        </gresource>
    </gresources>
    

    然后编译成C:

    glib-compile-resources.exe myapp.gresource.xml --generate-source --target=resources.c
    

    并在您的应用程序源中包含 resources.c

    然后使用嵌入文件作为窗口图标:

    gtk_window_set_icon_from_file (window, "resource:///com/example/myapp/icon.png", NULL);
    

    还可以考虑使用 gtk_window_set_default_icon_from_file 设置图标以将其也应用于对话框

    【讨论】:

      【解决方案3】:

      这个问题比较老,但是我在谷歌搜索类似问题时偶然发现了它。因此,也许以下内容会有所帮助,这取决于@DrOli 的回答,他描述了一种非常通用的方法。 首先使用 ImageMagicks convert 将 PNG 转换为 XPM

      convert about.png about.xpm
      

      将新文件包含到您的代码中并以 gtkmm 方式创建 pixbuf

      #include <gdkmm/pixbuf.h>
      #include "about.xpm"
      
      Glib::RefPtr< Gdk::Pixbuf > logo = Gdk::Pixbuf::create_from_xpm_data(about);
      

      瞧...

      【讨论】:

      • 它给出了很多关于将字符串常量转换为 'char*' 的警告。但它仍然有效。 :D
      • @munikarmanish 是的,你是对的,我忘了说必须更改第一行:/* XPM */static const char *about[] = {/* columns rows colors chars-per-pixel */
      【解决方案4】:

      我们对此有点陌生,需要完成基本相同的事情,但采用了不同的方法。

      值得注意的是,将 png(s) 转换为 xpm(s),然后将“原始 xpm(s)”信息作为“变量”加载/复制到您的原始代码中,然后在 GTK 等中使用 gdk_pixbuf_new_from_xpm_data() .. .等等

      这样,原始 xpm 被编译为代码的一部分,然后就不需要在外部搜索文件等了。

      这意味着从 png 中丢失一些 xpm 无法支持的功能,但这很容易,甚至我们“非 IT 人员”也可以管理它。

      这也允许直接访问“图像”,因为它可以在代码中作为“文本”进行编辑,很容易做出变化和附加图标等,并且很容易改变图标/图像以编程方式“实时”。

      它也非常便携。例如,我们也在 Windows 上的 Gtk-Fortran 中使用它……效果很好。

      【讨论】:

        猜你喜欢
        • 2018-05-26
        • 1970-01-01
        • 2015-06-13
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多