Created
January 22, 2021 15:16
-
-
Save iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb to your computer and use it in GitHub Desktop.
gimp nik-collection plugins
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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
commented
Mar 26, 2025
via email
Hello Iiey,
Thank you for all this work you have done on the Nik Collection plugin for
Google. I followed the installation of the script to load Gimp 3 this
"nikplugin.py" and well taken, we see it in the Gimp starter window. But I
do not find the file of Nik Collection in the column of filters, I tried
several paths in the script without result. I attach you a PDF with all the
explanations of the installation, please look at what error I made.
Jean-Louis
Le mer. 26 mars 2025 à 00:31, nemo ***@***.***> a écrit :
… ***@***.**** commented on this gist.
------------------------------
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
<https://www.gimp-forum.net/Thread-Converting-python-plugin-in-shellout-py-from-gimp-2-x-to-3-x>
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.
—
Reply to this email directly, view it on GitHub
<https://gist.github.com/iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb#gistcomment-5512510>
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AK4JONIX5OKO3SNCUYGTQE32WHRN5BFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTANZVGIYTCNZQU52HE2LHM5SXFJTDOJSWC5DF>
.
You are receiving this email because you commented on the thread.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>
.
--
*Photo J.L.R*
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
Did it help when your update your gimp to v3.0.2 and use the latest state of the script in my repo?
Everything is OK Nik Collection works with Gimp 3.0.2. Thank you, I created
a tutorial on Youtube in French or I talk about the Gimp forum, I look with
AI to translate it.
You can look at this address: https://youtu.be/igvfbicdwzq
Le sam. 29 mars 2025 à 17:32, nemo ***@***.***> a écrit :
… ***@***.**** commented on this gist.
------------------------------
Did it help when your update your gimp to v3.0.2 and use the latest state
of the script in my repo?
—
Reply to this email directly, view it on GitHub
<https://gist.github.com/iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb#gistcomment-5519346>
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AK4JONMXDCEGNZPDQ73N7FD2W3DJFBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTANZVGIYTCNZQU52HE2LHM5SXFJTDOJSWC5DF>
.
You are receiving this email because you commented on the thread.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>
.
--
*Photo J.L.R*
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment