近期想尝试编写gimp插件,在gimp官网看到了三篇简明教程,顺便翻译了下,由于本人英文,计算机知识有限,文中难免有warning,error出现,欢迎指正。

《How to write a GIMP plug-in》

原文:http://developer.gimp.org/writing-a-plug-in/1/index.html

作者:Dave Neary

在这篇文章中,我将介绍GIMP插件基础和libgimp库的API。并且演示如何使用PDB使其他脚本作者获得我们的插件

介绍

新的开发者经常会被GIMP的大小和声誉所吓到,他们认为编写一个插件会是一个困难的任务,本系列文章的目标就是要消除这种感觉,展示如何简单的编写C插件

在这部分,我将介绍插件的基本元素。我们将看到如何去安装一个插件、从图片中获取数据并且直接进行操作

结构

GIMP脚本接口集中在程序数据库中(PDB)。在程序启动的时候,GIMP在预先定义的位置去寻找插件和脚本,并且要求每个新脚本去识别自身。

插件在这个时候向PDB声明它自己,并且通过信息来确定自己在菜单中的层次结构,输入参数,输出参数。

当一个脚本或插件想要使用我们的插件,它会通过PDB获取,PDB通过透明的方式管理着参数通信的方向。

要接触插件的内部功能必须先打包在核心内,将会注册到PDB。第二点,这个功能才能在libgimp里正常执行。

这些就是介绍,现在,我们将会看见一个更接近我们第一个插件的东东——“Hello world!”

编译插件

为了编译简单的GIMP插件,你需要libgimp头文件,以及相关的工具——gimptool

使用这个工具,你可以安装插件到用户目录(~/.gimp-2.0/plug-ins),或是全局插件的目录

语法是:

gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c

使用这个工具的其它选项,还可以进行脚本的安装和卸载插件

行为

一个gimp插件典型行为可以分为3种。(1)它可以获取图像数据,修改并返回修改后的图像,比如边缘检测。(2)它可以生成图像并返回生成的图像,像script-fus脚本或是jpeg文件读取插件。(3)或者它能获取图像,处理它而不是修改它的数据,像文件保存插件。

要点

#include <libgimp/gimp.h>

这个头文件可以使我们获取所有基本插件所需的元素

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

这个结构体正如它的名字一样,它包含四个函数指针,它们将会在插件的生存期内被调用,init和quit是可选的,因此我们可以为他们设置空值(NULL),但是其余的两个函数,query和run,是强制性的

GIMP启动的时侯会调用init()函数,这个函数并不是典型的插件必须函数,一些插件使用它来进行二次搜索,这并不是由内核来执行的,这个函数没有被标准的gimp插件使用,不过,在某个文件存在的境况下,一个插件去注册一些步骤会更有用。
quit()函数也不常被使用,当GIMP即将被关闭的时候会被调用,在script-fu插件中被用来释放资源

query()函数当插件启动运行?时被第一次调用,并且每次当插件改变时被调用

run()函数是插件的中心,当插件运行时被调用,它获取插件的名称(一个插件可以注册几个程序),输入参数,一个指向输出参数的指针,然后决定是交互方式还是脚本方式去开始,然后完成所有插件的处理,它的原型是:

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

MAIN()

MAIN是一个C的宏,它拥有一点黑暗魔法去初始化参数。它也调用适当的PLUG_IN_INFO函数,这取决于时间,你的插件需要它。

query()函数

query()函数处理程序登记和输入的参数定义。这些信息保存起来用于加速程序启动的时间,并且只有在插件被修改后会刷新
我们的“Hello world!”插件的query函数如下所示:

static void
query (void)
{
static GimpParamDef args[] =
{
{
GIMP_PDB_INT32,
"run-mode",
"Run mode"
},
{
GIMP_PDB_IMAGE,
"image",
"Input image"
},
{
GIMP_PDB_DRAWABLE,
"drawable",
"Input drawable"
}
}; gimp_install_procedure (
"plug-in-hello",
"Hello, world!",
"Displays \"Hello, world!\" in a dialog",
"David Neary",
"Copyright David Neary",
"",
"_Hello world...",
"RGB*, GRAY*",
GIMP_PLUGIN,
G_N_ELEMENTS (args), ,
args, NULL); gimp_plugin_menu_register ("plug-in-hello",
"/Filters/Misc");
}

GimpParamDef包含三个数据——参数类型,参数名,一个描述参数的字符串

gimp_install_procedure声明了程序名,一些描述和帮助字符串,插件所在菜单路径,插件处理的图像类型,在结尾,输入输出参数的个数,以及参数的描述符。

“RGB*, GRAY*” 声明了处理图像的类型。它可以是RGB,INDEXED或是GRAY,透明或是不透明。所以”RGB*, GRAY*”用于描述RGB,RGBA,GRAY图像类型

GIMP_PLUGIN声明这个是外部程序,不在GIMP内核中执行。

为了添加一个存根,我们运行函数,我们可以检验我们的插件具有必不可少的元素,可以测试它已经在PDB中为自己注册。使用”Xtns->Plug-in Details”插件。

Plug-in details

Our plug-in is in the menus

run() 函数

另一个请求PLUG_IN_INFO的函数是run。插件的核心就在这里。

输出值(原型中的返回值)必须拥有至少一个相关的值,典型的就是插件的状态,这个参数值如”GIMP_PDB_SUCCESS”

运行模式

我们可以通过不同方式的运行插件,可以在GIMP运行时在菜单交互运行,或是脚本或批处理,或者通过“滤镜 – 重复上次操作”快捷方式。

“run_mode”输入的参数可以是以下三个中的一个”GIMP_RUN_INTERACTIVE”,”GIMP_RUN_NONINTERACTIVE”或是”GIMP_RUN_WITH_LAST_VALS”

“GIMP_RUN_INTERACTIVE”是典型的仅有的可以创建选项对话框的选项。否则,直接进行处理输入的参数或是内存中的参数。

为了我们的测试插件,我们使用一个简单的显示“Hello world!”的对话框,幸运的,这个使用GTK+实现非常的简单,我们的run函数如下:

static void
run (const gchar *name,
gint nparams,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals)
{
static GimpParam values[];
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpRunMode run_mode; /* Setting mandatory output values */
*nreturn_vals = ;
*return_vals = values; values[].type = GIMP_PDB_STATUS;
values[].data.d_status = status; /* Getting run_mode - we won't display a dialog if
* we are in NONINTERACTIVE mode */
run_mode = param[].data.d_int32; if (run_mode != GIMP_RUN_NONINTERACTIVE)
g_message("Hello, world!\n");
}

现在,当我们运行我们的插件,有如下动作:

可以点击查看完整的hello.c插件代码

下一部分

在下一部分我们将继续,制作一个更有用的插件,能够自己获取图像数据,我们将会看到如何使用GIMP图像结构,使插件工作的更好,一点点的处理图像。

[翻译]如何编写GIMP插件(一)的更多相关文章

  1. [翻译]如何编写GIMP插件(二)

    写在前面: 本人翻译并不专业,甚至英语不好,翻译内容仅供参考.由于博主是边学边翻译,所以不能保证翻译的准确性和正确性,如果可以,请查看原版学习,本文仅作学习记录之用. <How to write ...

  2. (翻译)编写属于你的jQuery插件

    Writing Your Own jQuery Plugins 原文地址:http://blog.teamtreehouse.com/writing-your-own-jquery-plugins j ...

  3. Gimp插件Hello world注释

    前一阵翻译gimp官网的编写插件教程,本打算继续翻译第二部分,但是感觉第一个例子还不是很懂,翻译第二部分有点理解不能,所以就读了一下源码,记录如下 #include <libgimp/gimp. ...

  4. 使用Qt编写模块化插件式应用程序

    动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...

  5. 使用 Python 编写 vim 插件

    使用 Python 编写 vim 插件 - 技术翻译 - 开源中国社区 code {margin: 0;padding: 0;white-space: pre;border: none;backgro ...

  6. Qt 显示透明flash和编写QtWebkit插件

    Qt 有两种方法可以显示flash. 1. 通过QAxWidget 调用com形式显示flash, 需要本机安装IE flash插件 2. 直接通过qwebview显示flash, 需要下载webki ...

  7. 编写jQuery插件--实现返回顶部插件

    国庆过去一周多了,作为IT界的具有严重’工作狂‘性质的宅人,居然还没走出玩耍的心情,拖了程序猿的脚后跟了.最近工作不顺,心情不佳,想吐槽下公司,想了还是厚道点,以彼之道还施彼身,觉得自己也和他们同流合 ...

  8. 编译安装gimp插件之Mathmap(流水记录)

    本文为在Fedora 20下编译安装Mathmap1.3.5的编译过程,如果你仅仅需要快速的安装Mathmap,那么请拉至文末的"快速安装" 其实,过程还是很有趣的,充满Error ...

  9. Lua编写wireshark插件初探——解析Websocket上的MQTT协议

    一.背景 最近在做物联网流量分析时发现, App在使用MQTT协议时往往通过SSL+WebSocket+MQTT这种方式与服务器通信,在使用SSL中间人截获数据后,Wireshark不能自动解析出MQ ...

随机推荐

  1. 鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)

    本文总结了Linux操作系统来管理我们的硬盘和文件系统需要使用命令.当我们在系统中增加一个硬盘驱动器.什么是我们需要去通过这个硬盘就可以真正使用步骤?下面步骤: (1)对磁盘进行分区,新建能够使用的分 ...

  2. [SignalR]配置路由

    原文:[SignalR]配置路由 注册路由,在代码如下(SignalR 1.*): 脚本修改如下: 但是其官方文档解释是: By default, the route URL which client ...

  3. SQL 将URL编码转汉字!

    原文:SQL 将URL编码转汉字! -- ============================================= -- 作 者: ruijc -- 描 述: 将Url编码转明文字符 ...

  4. JavaScript技巧&写法

    原文:JavaScript技巧&写法 JavaScript技巧篇: 1>状态机 var state = function () { this.count = 0; this.fun = ...

  5. Android对于静默安装和卸载

    在一般情况下,Android系统安装apk会有一个安装界面,用户可以单击确定或取消apk设备. 但在实际的项目需求中,有一种需求.就是希望apk在后台安装(不出现安装界面的提示),这样的安装方式称为静 ...

  6. 【leetcode】Clone Graph(python)

    类似于二叉树的三种遍历,我们能够基于遍历的模板做非常多额外的事情,图的两种遍历,深度和广度模板相同也能够做非常多额外的事情,这里举例利用深度优先遍历的模板来进行复制,深度优先中,我们先訪问第一个结点, ...

  7. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

  8. JS基础——数组总结

    JS中数组被觉得是一种对象,慢慢的,怎么忽然感觉,JS中仅仅要能够独立出来的概念怎么都能够当成对象来解释呢?有点儿怀疑.继续学吧.先来总结一下JS中数组是怎样详细使用的. 一.创建 数组的创建在JS中 ...

  9. Linux C/C++计划Shell命令大杂烩(1)

    1, 请参见发行信息 cat /etc/issue 2, 查看内核版本号 uname -r 查看内核版本号 uname -p 查看处理器类型32bit/64bit uname -n 查看网络主机名(o ...

  10. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...