在C中为GIMP创建插件
#c #plugin #gimp #automatizacão

好吧,今天我们将创建一个P插件来自动化一些重复且无聊的任务。

在开始执行代码之前,必须安装koud0。

入口,让我们安装它。

安装gimptool

在我们继续之前,我必须澄清一下我将在Linux中执行此操作,因为我不使用窗口,那么如果您不知道在哪里可以找到窗口的Koud0。

但不用担心,根据strontic的说法,我会帮助您在窗口上可能在哪里,他说该文件可以位于Koud3中。

入口,如果您设法找到了文件,则可以使用插件的创建。

现在,让我们在ubuntu/debian的Linux上安装gimptool。

只需转到终端执行命令:koud4。

准备就绪,只是,现在让我们创建一个插件。

创建一个插件

美丽,在创建插件之前,我将解释一下我会做的。

为了使学习过程变得困难,我将制作一个非常简单但非常简单的插件。

基本上放了一个指南(指南)。

如果您不知道什么是指南。打开gimp,然后转到“图像”或“图像”菜单,如果您是葡萄牙语,然后见他。

将鼠标传递到顶部,您会看到4个选项。

这是一个屏幕捕获。

Localização do guide

单击第一个选项,将有一个屏幕选择方向并插入指南的位置值。

入口,位于垂直方向和50%位置,例如在图像中间出现蓝线,例如在此屏幕截图中。

A linha azul de guia

我想自动化这个,因为它很无聊打开小屏幕并插入值。

入口,首先,让我们创建一个称为koud5的文件。

我将把整个时间都放在测试中,然后我解释了一点。

#include <libgimp/gimp.h>

static void query (void);
static void run (
    const gchar *name,
    gint nparams,
    const GimpParam *param,
    gint *nreturn_vals,
    GimpParam **return_vals);

GimpPlugInInfo PLUG_IN_INFO = {
    NULL, // init
    NULL, // quit
    query,
    run
};

static void query (void) {

  static GimpParamDef args[] = {
    {
      GIMP_PDB_INT32, // Tipo de variável
      "run-mode", // Nome da variável
      "Run mode" // Descrição da variável
    },
    {
      GIMP_PDB_IMAGE, // Tipo de variável
      "image", // Nome da variável
      "Input image" // Descrição da variável
    },
    {
      GIMP_PDB_DRAWABLE, // Tipo de variável
      "drawable", // Nome da variável
      "Input drawable" // Descrição da variável
    }
  };

  gimp_install_procedure (
    "plug-in-add_guias", // Nome do procedure
    "Adiciona guia", // Uma pequena descrição do que o procedure faz
    "Ele adiciona uma guia no meio da imagem", // Uma descrição completa
    "Alexandre dos Santos Alves", // Seu nome
    "Copyright Alexandre", // Licença
    "2023", // Ano que foi criado
    "_Adicona Guia", // Nome que vai aparece no menu
    "RGB*, GRAY*", // Tipo de imagem que o procedure vai trabalhar
    GIMP_PLUGIN, // Tipo de procedure
    G_N_ELEMENTS (args), // Tamanho do parâmetro
    0, // Tamanho do retorno
    args, // o parâmetro do procedure
    NULL); // o retorno do procedure.

  gimp_plugin_menu_register ("plug-in-add_guias",
                               "<Image>/Tools/");
}

static void run (
    const gchar      *name,
    gint              nparams,
    const GimpParam  *param,
    gint             *nreturn_vals,
    GimpParam       **return_vals)
    {

    // A variável que vai ser retornado
    static GimpParam  values[1];
    GimpPDBStatusType status = GIMP_PDB_SUCCESS; 
    GimpRunMode       run_mode;
    GimpDrawable     *drawable;

    /* Definindo valores de saída obrigatórios    */
    *nreturn_vals = 1;
    *return_vals  = values;

    /* É obrigatório isso */
    values[0].type = GIMP_PDB_STATUS;
    values[0].data.d_status = status;

    run_mode = param[0].data.d_int32;
    gint image = param[1].data.d_image;
    drawable = gimp_drawable_get(param[2].data.d_drawable);

    gdouble metade_do_tamanho_da_image = (gimp_image_width(image) * 0.5);

    gimp_image_add_vguide(image, metade_do_tamanho_da_image);

    gimp_displays_flush ();
}

MAIN()

以这种方式,将其复制并粘贴到文件并运行文件所在的命令。

se窗口,C:\program files\GIMP 2\bin\gimptool-2.0.exe --install add_guias.c
se for linux,gimptool-2.0 --install add_guias.c

如果偶然地出现在下面,您可以忽略。

add_guias.c:92:2: warning: ‘gimp_drawable_get’ is deprecated: Use 'gimp_drawable_get_buffer' instead [-Wdeprecated-declarations]
   92 |  drawable = gimp_drawable_get(param[2].data.d_drawable);
      |  ^~~~~~~~
In file included from /usr/include/gimp-2.0/libgimp/gimp.h:41,
                 from add_guias.c:1:
/usr/include/gimp-2.0/libgimp/gimpdrawable.h:52:16: note: declared here
   52 | GimpDrawable * gimp_drawable_get                    (gint32         drawable_ID);
      |                ^~~~~~~~~~~~~~~~~

如果没有错误,现在会有此警告,现在,它将出现在GIM上,然后关闭GIM并再次打开它,然后在“工具”菜单(工具)中看到一个带有名称添加指南的项目。<<<<<<<<<< /p>

创建一个新图像,然后单击它以查看发生的事情。

好吧,如果蓝线出现,所以它可以工作,如果您不这样做,则可以解决。

撒谎,评论中评论,问题。

但是现在,让我们了解代码。

在第一行中,我们包括一个用于插件构建的重要库,因此对此没有太多解释。

在此下方,我们可以看到两个功能,queryrun

...

static void query (void);
static void run (
    const gchar *name,
    gint nparams,
    const GimpParam *param,
    gint *nreturn_vals,
    GimpParam **return_vals);

GimpPlugInInfo PLUG_IN_INFO = {
    NULL, // init
    NULL, // quit
    query,
    run
};

...

但是在解释这些功能之前,让我们跳到此部分并查看变量koud10。

此变量可以存储4个值。

但是这些值是什么?

是GIM会调用的功能。

也就是说,第一个值是在GIMP初始化期间调用的函数,就我而言,我将NULL放置,因为我不想在启动时执行任何操作。

第二个是quit,它将在gimp闭合期间称为NULL

我提到的这两个值是可选的,也就是说,没有一个函数,只需放置koud11。

现在,我要提到的两个附近是义务。

第三是query,我不知道该解释什么,因为文档并没有说太多,但是在我的理解中,我想它用于安装插件,但让我们尝试一下了解更多信息,当我们处于功能query()时。

第四和最后一个是run,它是代码的核心,因为它会在菜单或脚本fu或python fu时旋转。

现在,知道了这一点,让我们转到创建的两个功能来理解parano仪表。

static void query (void);
static void run (
    const gchar *name, // Nome do plug-in
    gint nparams, // Quantidade de parâmetro
    const GimpParam *param, // O parâmetro do plug-in
    gint *nreturn_vals, // Quantidade de retorno
    GimpParam **return_vals); // O retorno do plug-in

在koud8 parano上有很多解释,让我们转到run

第一个parano是插件的名称。
第二个是Parano的数量。
第三是插入式Parano。
房间是回报的数量。
第五是插件的返回。

美丽,知道这些部分是什么。

现在,让我们了解Funa query(void)中的内容。

static void query (void) {

  static GimpParamDef args[] = {
    {
      GIMP_PDB_INT32, // Tipo de variável
      "run-mode", // Nome da variável
      "Run mode" // Descrição da variável
    },
    {
      GIMP_PDB_IMAGE, // Tipo de variável
      "image", // Nome da variável
      "Input image" // Descrição da variável
    },
    {
      GIMP_PDB_DRAWABLE, // Tipo de variável
      "drawable", // Nome da variável
      "Input drawable" // Descrição da variável
    }
  };

  gimp_install_procedure (
    "plug-in-add_guias", // Nome do procedure
    "Adiciona guia", // Uma pequena descrição do que o procedure faz
    "Ele adiciona uma guia no meio da imagem", // Uma descrição completa
    "Alexandre dos Santos Alves", // Seu nome
    "Copyright Alexandre", // Licença
    "2023", // Ano que foi criado
    "_Adicona Guia", // Nome que vai aparece no menu
    "RGB*, GRAY*", // Tipo de imagem que o procedure vai trabalhar
    GIMP_PLUGIN, // Tipo de procedure
    G_N_ELEMENTS (args), // Tamanho do parâmetro
    0, // Tamanho do retorno
    args, // o parâmetro do procedure
    NULL); // o retorno do procedure.

  gimp_plugin_menu_register ("plug-in-add_guias", // nome do plug-in
                               "<Image>/Tools/"); // Localização dele no menu
}

首先,我们声明一个差异static GimpParamDef args[],可以知道插件收到的parano的值是什么。

在我们的情况下,我们将保留图案,即run-mode,Koud23和drawable

但是,如果偶然地,您的插件需要更多的值,我会放置每种差异的列表,以使您更容易。

的数组 的数组 的数组
变化的类型 描述£o
gimp_pdb_int32 32位整数
gimp_pdb_int16 16位整数
gimp_pdb_int8 8位整数
gimp_pdb_float float
gimp_pdb_string 字符串
gimp_pdb_int32array int32
gimp_pdb_int16array int16
gimp_pdb_int8array int8
gimp_pdb_floatarray 浮子的数组
gimp_pdb_stringarray 字符串数组
gimp_pdb_color 颜色
gimp_pdb_item 项目ID
gimp_pdb_display 显示ID
gimp_pdb_image 图像ID
gimp_pdb_layer 图层ID
gimp_pdb_channel 频道ID
gimp_pdb_drawable 可绘制的ID
gimp_pdb_selection 选择ID
gimp_pdb_colorarray 颜色数组
gimp_pdb_vectors 向量(psath)ID
gimp_pdb_parasite 寄生虫
gimp_pdb_status 过程返回状态
gimp_pdb_end 最后枚举值的标记

美女,我们已经了解了args[],现在让我们转到我们称为Koud26的功能。

有很多要解释的东西,因为如果您阅读帕拉诺旁边的评论,您可以拥有一个领域,但是基本上它的作用是在Gimp上安装插件。

入口,让我们转到另一个gimp_plugin_menu_register的功能。顾名思义,他将在菜单上注册插件,在我们的情况下将放置在Tools上。

在这里我们结束函数query()

让我们去run(),因为它有点大,我会将解释放在代码中。

...

static void run (
    const gchar      *name,
    gint              nparams,
    const GimpParam  *param,
    gint             *nreturn_vals,
    GimpParam       **return_vals)
    {

    // A variável que vai ser retornado
    static GimpParam  values[1];

    // Como o nome diz é o status
    GimpPDBStatusType status = GIMP_PDB_SUCCESS; 

    // O run_mode é usado para saber se estar no modo interativo ou não
    // Não irei explicar isso nesse blog
    GimpRunMode       run_mode;

    // Variável que, por padrão, é o layer(camada) atual.
    GimpDrawable     *drawable;

    /* Definindo valores de saída obrigatórios    */
    *nreturn_vals = 1; // definindo o tamanho da variável values
    *return_vals  = values;

    /* É obrigatório isso */
    values[0].type = GIMP_PDB_STATUS;
    values[0].data.d_status = status;

    // Aqui temos uma forma de pegar os valores passados no parâmetro
    // Eu vou colocar lista de tipos de variáveis abaixo fora do código
    // Sobre o índices da variável 'param', ele está na mesma ordem
    // que você declarou na função 'query' da variável 'args'
    run_mode = param[0].data.d_int32;
    gint image = param[1].data.d_image;
    drawable = gimp_drawable_get(param[2].data.d_drawable);

    // Agora, a partir daqui, são os códigos que você pode fazer
    // Aqui estamos pegando a metade do tamanho da imagem
    // Para poder colocar a guia no meio
    gdouble metade_do_tamanho_da_image = (gimp_image_width(image) * 0.5);

    // essa função coloca a guia, primeiro parâmetro é a imagem
    // o segundo é a posição dessa guia
    gimp_image_add_vguide(image, metade_do_tamanho_da_image);

    // Essa função serve para atualizar o que você fez no código,
    // mas não é necessário para o nosso caso,
        // Não estamos alterando a imagem
    gimp_displays_flush ();
}

...
方差类型
membro
gint32 d_int32
gint16 d_int16
guint8 d_int8
gdouble d_float
gchar d_string
gint32 d_int32array
gint16 d_int16array
guint8 d_int8array
gdouble d_floatarray
gchar d_stringarray
gimprgb d_colorarray
gimprgb d_color
gint32 d_display
gint32 d_image
gint32 d_item
gint32 d_layer
gint32 d_layer_mask
gint32 d_channel
gint32 d_drawable
gint32 d_selection
gint32 d_boundary
gint32 d_vectors
gint32 d_unit
gimpparasite d_parasite
gint32 d_tattoo
gimppdbstatustype d_status

如果您不了解此列表或不认识我们,只需做到param[i].data.membro,请将成员更改为列表中的项目。

最后,我们必须放置koud32,它必须具有此功能,并且它在文件的末尾。

好吧,这样,您就可以自己构建一个插件,但您不是,因为您仍然知道GIMP中的哪些都可以使用。

这是Gimp的文档。

现在,是的,我们可以在这里结束。

好吧,就是这样,再见!