Skip to content

Instantly share code, notes, and snippets.

@iiey
Created January 22, 2021 15:16
Show Gist options
  • Select an option

  • Save iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb to your computer and use it in GitHub Desktop.

Select an option

Save iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb to your computer and use it in GitHub Desktop.
gimp nik-collection plugins
#!/usr/bin/env python
"""
ShellOut.py
call an external program passing the active layer as a temp file. Windows Only(?)
Author:
Rob Antonishen
Version:
0.7 fixed file save bug where all files were png regardless of extension
0.6 modified to allow for a returned layer that is a different size
than the saved layer for
0.5 file extension parameter in program list.
0.4 modified to support many optional programs.
this script is modelled after the mm extern LabCurves trace plugin
by Michael Munzert http://www.mm-log.com/lab-curves-gimp
and thanks to the folds at gimp-chat has grown a bit ;)
License:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
The GNU Public License is available at
http://www.gnu.org/copyleft/gpl.html
"""
from gimpfu import *
import shlex
import subprocess
import os, sys
import tempfile
# program list function (globals are evil)
def listcommands(option=None):
#
# Insert additional shell command into this list. They will show up in the drop menu in this order.
# Use the syntax:
# ["Menu Label", "command", "ext"]
#
# Where what gets executed is command fileame so include and flags needed in the command.
programlist = [
["DFine 2", "\"C:\\Program Files\\Google\\Nik Collection\\Dfine 2\\Dfine2.exe\"", "png"],
["Sharpener Pro 3", "\"C:\\Program Files\\Google\\Nik Collection\\Sharpener Pro 3\\SHP3OS.exe\"", "png"],
["Viveza 2", "\"C:\\Program Files\\Google\\Nik Collection\\Viveza 2\\Viveza 2.exe\"", "png"],
["Color Efex Pro 4", "\"C:\\Program Files\\Google\\Nik Collection\\Color Efex Pro 4\\Color Efex Pro 4.exe\"",
"jpg"],
["Analog Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\Analog Efex Pro 2\\Analog Efex Pro 2.exe\"",
"jpg"],
["HDR Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\HDR Efex Pro 2\\HDR Efex Pro 2.exe\"", "jpg"],
["Silver Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\Silver Efex Pro 2\\Silver Efex Pro 2.exe\"",
"jpg"],
["", "", ""]
]
if option == None: # no parameter return menu list, otherwise return the appropriate array
menulist = []
for i in programlist:
if i[0] != "":
menulist.append(i[0])
return menulist
else:
return programlist[option]
def plugin_main(image, drawable, visible, command):
pdb.gimp_image_undo_group_start(image)
# Copy so the save operations doesn't affect the original
if visible == 0:
# Save in temporary. Note: empty user entered file name
temp = pdb.gimp_image_get_active_drawable(image)
else:
# Get the current visible
temp = pdb.gimp_layer_new_from_visible(image, image, "Visible")
image.add_layer(temp, 0)
buffer = pdb.gimp_edit_named_copy(temp, "ShellOutTemp")
# save selection if one exists
hassel = pdb.gimp_selection_is_empty(image) == 0
if hassel:
savedsel = pdb.gimp_selection_save(image)
tempimage = pdb.gimp_edit_named_paste_as_new(buffer)
pdb.gimp_buffer_delete(buffer)
if not tempimage:
raise RuntimeError
pdb.gimp_image_undo_disable(tempimage)
tempdrawable = pdb.gimp_image_get_active_layer(tempimage)
# get the program to run and filetype.
progtorun = listcommands(command)
# Use temp file names from gimp, it reflects the user's choices in gimp.rc
# change as indicated if you always want to use the same temp file name
# tempfilename = pdb.gimp_temp_name(progtorun[2])
tempfilename = os.path.join(tempfile.gettempdir(), "ShellOutTempFile." + progtorun[2])
# !!! Note no run-mode first parameter, and user entered filename is empty string
pdb.gimp_progress_set_text("Saving a copy")
pdb.gimp_file_save(tempimage, tempdrawable, tempfilename, tempfilename)
# Build command line call
command = progtorun[1] + " \"" + tempfilename + "\""
args = shlex.split(command)
# Invoke external command
pdb.gimp_progress_set_text("calling " + progtorun[0] + "...")
pdb.gimp_progress_pulse()
child = subprocess.Popen(args, shell=False)
child.communicate()
# put it as a new layer in the opened image
try:
newlayer2 = pdb.gimp_file_load_layer(tempimage, tempfilename)
except:
RuntimeError
tempimage.add_layer(newlayer2, -1)
buffer = pdb.gimp_edit_named_copy(newlayer2, "ShellOutTemp")
if visible == 0:
drawable.resize(newlayer2.width, newlayer2.height, 0, 0)
sel = pdb.gimp_edit_named_paste(drawable, buffer, 1)
drawable.translate((tempdrawable.width - newlayer2.width) / 2, (tempdrawable.height - newlayer2.height) / 2)
else:
temp.resize(newlayer2.width, newlayer2.height, 0, 0)
sel = pdb.gimp_edit_named_paste(temp, buffer, 1)
temp.translate((tempdrawable.width - newlayer2.width) / 2, (tempdrawable.height - newlayer2.height) / 2)
pdb.gimp_buffer_delete(buffer)
pdb.gimp_edit_clear(temp)
pdb.gimp_floating_sel_anchor(sel)
# load up old selection
if hassel:
pdb.gimp_selection_load(savedsel)
image.remove_channel(savedsel)
# cleanup
os.remove(tempfilename) # delete the temporary file
gimp.delete(tempimage) # delete the temporary image
# Note the new image is dirty in Gimp and the user will be asked to save before closing.
pdb.gimp_image_undo_group_end(image)
gimp.displays_flush()
register(
"python_fu_shellout",
"Call an external program",
"Call an external program",
"Rob Antonishen",
"Copyright 2011 Rob Antonishen",
"2011",
"<Image>/Filters/ShellOut...",
"RGB*, GRAY*",
[(PF_RADIO, "visible", "Layer:", 1, (("new from visible", 1), ("current layer", 0))),
(PF_OPTION, "command", "Program:", 0, listcommands())
],
[],
plugin_main,
)
main()
@TutoPhoto

Copy link
Copy Markdown

With GIMP 3.0 What should it be corrected in the Shellout.py file to integrate Nick Collection?

@iiey

iiey commented Mar 23, 2025

Copy link
Copy Markdown
Author

I found did script which was worked with 2.x, but now 3.x has API breaking change (possibly since 2.99.x) with the previous version.
Sorry, but I'm not a gimp developer either, we may need to ask gimp forum.

@TutoPhoto

Copy link
Copy Markdown

I changed in the file shellOut.py les Where what gets executed is command fileame so include and flags needed in the command.
programlist = [
["DFine 2", ""C:\Program Files\Google\Nik Collection\Dfine 2\Dfine2.exe"", "png"], by
["DFine 2", ""C:\Program\Google\Nik Collection\Dfine 2\Dfine2.exe"", "png"]
Now in the filters of Gimp 3.0 I have the Shellout Mes command when I click an error message opens, it must not have a big change to operate Nik Collection on Gimp 3.0

@iiey

iiey commented Mar 25, 2025

Copy link
Copy Markdown
Author

Hi TutoPhoto,
I don't think so, from Gimp 2.x to 3.x is 7 years distance, the hold API was changed. The only thing we can keep is the basic idea of this script.

I created a thread in gimp-forum to ask for help and learned something about creating gimp plug-ins.

I also created a separate repo for the new nik collection plugin here: https://github.com/iiey/nikGimp

You could try it out and join the thread discussion if is there any further concern. This gist is pretty much obsolete, maybe i will close it sooner or later.

@TutoPhoto

TutoPhoto commented Mar 26, 2025 via email

Copy link
Copy Markdown

@iiey

iiey commented Mar 27, 2025

Copy link
Copy Markdown
Author

Hi Jean-Louis,
You are welcome! The PDF was probably no longer there if we replied via email. You could go to this page and "Attach files" directly.
I added some ideas to check here, maybe you could try and let me know what the issue is:
https://www.gimp-forum.net/Thread-Converting-python-plugin-in-shellout-py-from-gimp-2-x-to-3-x?pid=43566#pid43566

@iiey

iiey commented Mar 29, 2025

Copy link
Copy Markdown
Author

Did it help when your update your gimp to v3.0.2 and use the latest state of the script in my repo?

@TutoPhoto

TutoPhoto commented Mar 29, 2025 via email

Copy link
Copy Markdown

@Kamyl68

Kamyl68 commented Jun 15, 2026

Copy link
Copy Markdown

Hi Iley, I'm having a problem with your nikplugin.py. I have MacOS Monterey with Gimp3 and Google Nik Collection 1.2.11 installed. Everything works fine except Dfine2, Viveza2, and Sharpener3. When I call these programs, they crash. What could be the problem? Could you help me?

@iiey

iiey commented Jun 15, 2026

Copy link
Copy Markdown
Author

Hi Kamyl68,

you mean the plugin from here and not this shellout script, right? https://github.com/iiey/nikGimp
Could you please create an issue there with some more detail description about the crash (ouput error/message)?
Unfortunately, I don't have Mac with up-to-date OS to reproduce the incident, without some additional info, I could not really work on the fix.

@Kamyl68

Kamyl68 commented Jun 15, 2026

Copy link
Copy Markdown

Hi, I can certainly attach them, but this site doesn't allow me to send them in txt format. Frankly, I don't know what format Github allows...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment