I’m trying to use functions of gimp 2.8.22 to convert a pdf to jpeg and i want to do that with a python script using the gimpfu library from my windows cmd (i have installed python 3.6.1).
Right now, i’t trying to do that with an example script:
#!/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()
I try to run the script from my cmd like this:
gimp-2.8 --no-interface --batch '(python_fu_hello_world RUN-NONINTERACTIVE "Hello" Arial 50 red)' -b '(gimp-quit 1)'
However, no matter what i do, i always geht the same error message:
(gimp-2.8:1020): LibGimpBase-WARNING **: gimp-2.8: gimp_wire_read():
error
edit: Ok, thanks. I left out the interface statement and I also tried out the most simple example to figure out whats wrong:
#!/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()
The script actually works when i run it from Gimp itself, but when i try to run it from my cmd, Gimp opens with another cmd saying: Error: ( : 1) eval: unbound variable: hello_world
Does someone know what i’m missing here?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
To run a python script you don’t need to have it register as a plugin. IMHO you should even avoid this, this unnecessarily pollutes Gimp’s menus and procedure name space. Here is an example:
The batch script (saved as 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
To call it:
gimp -idf --batch-interpreter python-fu-eval -b "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')" -b "pdb.gimp_quit(1)"
The parameters in slow-motion:
-idf: work without user interface, and load neither data nor fonts (you may perhaps need to keep the fonts to load pdfs)--batch-interpreter python-fu-eval: whatever follows-bis Python, not script-fu"import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')": the code that we ask Gimp to execute, namely:import sys;sys.path=['.']+sys.path;: extend the import path to include the current directoryimport batch;: import the file with our script, which is now in a directory which is part of the path.batch.run('./images'): call therun()function of thebatchmodule we imported, giving it the name of a directory containing the images to process.
-b "pdb.gimp_quit(1)": another piece of python: exit when done.
Note how the command line cleverly uses double and single quotes to pass all parameters to Gimp and then to Python(*). And yes, you can use forward slashes as file separators in Windows.
To debug, matters are bit complicated in Windows because there is no always a stdout stream. Things that can help:
- remove the
-iparameter temporarily so that you get the UI and perhaps a chance to see messages. - Add
--verbosewhich makes Gimp start a secondary console window. - There are other tricks to see messages listed here.
- You can also start Gimp normally and run your script from the Python-fu console (Filters>Python-fu>Console). You will have to extend the path and import the file “manually”.
(*) In a Linux/OSX shell one would do the opposite: single quotes for the shell, double quotes for Python.
Method 2
Because the script you are using creates the image and then shows it in a window…. But you are calling Gimp with the --no-interface flag so the window is not shown.
IMHO to convert from PDF to JPEG, ImageMagick’s convert command would be a lot simpler.
Also, in Windows Gimp comes with its own built-in Python 2.7 interpreter, so you have to write your Python code for that version, and there is no need to install another one.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0