如何从命令行使用 gimpfu 运行 python 脚本?

How to run python scripts using gimpfu from command line?

我正在尝试使用 gimp 2.8.22 的功能将 pdf 转换为 jpeg,我想通过 python 脚本使用我的 windows cmd 中的 gimpfu 库(我已经安装了 python 3.6.1)。

现在,我正在尝试使用示例脚本来做到这一点:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world(initstr, font, size, color) :
    # First do a quick sanity check on the font
    if font == 'Comic Sans MS' :
        initstr = "Comic Sans? Are you sure?"

    # Make a new image. Size 10x10 for now -- we'll resize later.
    img = gimp.Image(1, 1, RGB)

    # Save the current foreground color:
    pdb.gimp_context_push()

    # Set the text color
    gimp.set_foreground(color)

    # Create a new text layer (-1 for the layer means create a new layer)
    layer = pdb.gimp_text_fontname(img, None, 0, 0, initstr, 10,
                                   True, size, PIXELS, font)

    # Resize the image to the size of the layer
    img.resize(layer.width, layer.height, 0, 0)

    # Background layer.
    # Can't add this first because we don't know the size of the text layer.
    background = gimp.Layer(img, "Background", layer.width, layer.height,
                            RGB_IMAGE, 100, NORMAL_MODE)
    background.fill(BACKGROUND_FILL)
    img.add_layer(background, 1)

    # Create a new image window
    gimp.Display(img)
    # Show the new image window
    gimp.displays_flush()

    # Restore the old foreground color:
    pdb.gimp_context_pop()

register(
    "python_fu_hello_world",
    "Hello world image",
    "Create a new image with your text string",
    "Akkana Peck",
    "Akkana Peck",
    "2010",
    "Hello world (Py)...",
    "",      # Create a new image, don't work on an existing one
    [
        (PF_STRING, "string", "Text string", 'Hello, world!'),
        (PF_FONT, "font", "Font face", "Sans"),
        (PF_SPINNER, "size", "Font size", 50, (1, 3000, 1)),
        (PF_COLOR, "color", "Text color", (1.0, 0.0, 0.0))
    ],
    [],
    hello_world, menu="<Image>/File/Create")

main()

我尝试从我的 cmd 中 运行 脚本,如下所示:

gimp-2.8 --no-interface --batch '(python_fu_hello_world RUN-NONINTERACTIVE "Hello" Arial 50 red)' -b '(gimp-quit 1)'

但是,无论我做什么,我总是收到相同的错误消息:

(gimp-2.8:1020): LibGimpBase-WARNING **: gimp-2.8: gimp_wire_read(): error

编辑:好的,谢谢。我省略了接口声明,我也尝试了最简单的例子来找出问题所在:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world():
 gimp.message("Hello, GIMP world!\n")

register(
 "hello_world",
 'A simple Python-Fu "Hello, World" plug-in',
 'When run this plug-in prints "Hello, GIMP world!" in a dialog box.',
 "Tony Podlaski",
 "Tony Podlaski 2017. MIT License",
 "2017",
 "Hello World",
 "",
 [],
 [],
 hello_world,
 menu="<Image>/Filters/HelloWorld",
)

main()

当我从 Gimp 本身 运行 它时,该脚本实际上有效,但是当我尝试从我的 cmd 运行 它时,Gimp 打开另一个 cmd 说: Error: ( : 1) eval: unbound variable: hello_world

有人知道我在这里错过了什么吗?

因为您使用的脚本会创建图像,然后将其显示在 window 中。...但是您使用 --no-interface 标志调用 Gimp,因此 window 是未显示。

恕我直言,从 PDF 转换为 JPEG,ImageMagick 的 convert 命令会简单得多。

此外,在 Windows 中,Gimp 自带内置 Python 2.7 解释器,因此您必须为该版本编写 Python 代码,没有必要安装另一个。

对于 运行 一个 python 脚本,您不需要将其注册为插件。恕我直言,您甚至应该避免这种情况,这会不必要地污染 Gimp 的菜单和过程名称 space。这是一个例子:

批处理脚本(另存为batch.py):

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import os, glob, sys, time
from gimpfu import *


def process(infile):
        print "Processing file %s " % infile
        image = pdb.gimp_file_load(infile, infile, run_mode=RUN_NONINTERACTIVE)
        drawable = image.active_layer

        print "File %s loaded OK" % infile
        pdb.plug_in_photocopy(image, drawable,8.,0.8,0.2,0.2)
        pdb.plug_in_cartoon(image, drawable, 7.,0.2)
        outfile=os.path.join('processed',os.path.basename(infile))
        outfile=os.path.join(os.path.dirname(infile),outfile)
        print "Saving to %s" % outfile
        pdb.file_jpeg_save(image, drawable, outfile, outfile, "0.5",0,1,0,"",0,1,0,0)
        print "Saved to %s" % outfile
        pdb.gimp_image_delete(image)


def run(directory):
        start=time.time()
        print "Running on directory \"%s\"" % directory
#   os.mkdir(os.path.join(directory,'processed'))
        for infile in glob.glob(os.path.join(directory, '*.jpg')):
                process(infile)
        end=time.time()
        print "Finished, total processing time: %.2f seconds" % (end-start)


if __name__ == "__main__":
        print "Running as __main__ with args: %s" % sys.argv

调用它:

gimp -idf --batch-interpreter python-fu-eval -b "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')" -b "pdb.gimp_quit(1)"

慢动作参数:

  • -idf: 在没有用户界面的情况下工作,既不加载数据也不加载字体(您可能需要保留字体才能加载 pdf)
  • --batch-interpreter python-fu-eval-b 后面的内容是 Python,不是 script-fu
  • "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')":我们要求Gimp执行的代码,即:
    • import sys;sys.path=['.']+sys.path;: 扩展导入路径以包含当前目录
    • import batch;:使用我们的脚本导入文件,该文件现在位于作为路径一部分的目录中。
    • batch.run('./images'):调用我们导入的batch模块的run()函数,给它一个包含要处理的图像的目录名称。
  • -b "pdb.gimp_quit(1)":另一段python:完成后退出。

注意命令行如何巧妙地使用双引号和单引号将所有参数传递给 Gimp,然后再传递给 Python(*)。是的,您可以在 Windows.

中使用正斜杠作为文件分隔符

要调试,Windows 中的事情有点复杂,因为并不总是有标准输出流。可以提供帮助的事情:

  • 暂时删除 -i 参数,以便您获得 UI 并且也许有机会看到消息。
  • 添加 --verbose 使 Gimp 启动辅助控制台 window。
  • 还有其他技巧可以查看列出的消息 here
  • 您还可以从 Python-fu 控制台(过滤器>Python-fu>控制台)正常启动 Gimp 和 运行 您的脚本。您将必须扩展路径并“手动”导入文件。

(*) 在 Linux/OSX shell 中会做相反的事情:shell 的单引号,Python.

的双引号