03-16-2018, 10:07 AM
(03-16-2018, 08:20 AM)DaveMac Wrote: Hi all,
I've been using Gimp for years on a fairly basic level. Recently I have been doing a lot of image stitching - there's overlap in the individual images so I just bring them in as layers, reduce the top level opacity, match positions, return it to full opacity and merge down. Not difficult but repetitive.
I make a lot of use of keyboard shortcuts ("Accelerators") and the preset "10% more Transparent" is great but I generally need to press it 3 or 4 times to get a useable level of transparency.
That got me thinking about Gimp's scripting potential, something I've never looked at before - "set active level to 60% opacity" with a single keypress would be so useful for me.
I'm very familiar with html and Office VBA but my first looks at python-fu have me very confused. If I just want this function do I have to create a plug-in and register it then get it to appear in the list of available commands so I can assign a combination of keys? The python console itself is already pretty confusing.
I think I've got something that could maybe do what I want but I can't figure how to run it to see what happens in order to debug. Then again maybe I'm completely off track...
➤> image = gimp.image_list()[0]
➤> active_layer = pdb.gimp_image_get_active_layer(image)
➤> pdb.gimp_layer_set_opacity(active_layer, 60)
Any help with solving this would be greatly appreciated.
By default, when you define a script where the first two parameters are an image and a layer, the script is called with these parameters set as a the current image and active layer, so you get them without doing anything specific.
You code you look like this:
Code:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os, sys
from gimpfu import *
# The functions that do it, they will be called with image/layer
# set to the image/layer on which you call the script
# Technically, they can also be called with 'layer' being actually a "channel",
# (layers and channels are both "drawable") but you can't set the opacity
# on a channel and the script will croak. Not really a problem here.
def opacity60(image,layer):
pdb.gimp_layer_set_opacity(layer, 60)
def opacity100(image,layer):
pdb.gimp_layer_set_opacity(layer, 100)
### Registrations
# Not strictly necessary, but this tells you where the file with the script is
whoiam='\n'+os.path.abspath(sys.argv[0])
# When Gimp starts it calls this script which executes the two calls to the register()
# function which themselves call Gimp and tell it what/how to call in this file.
# As you can see you can have two functions in one single file
register(
'opacity60', # identifier of the plugin. When defining keybaird shortcut, look for python-fu-opacity60
'Set opacity to 60%'+whoiam, # The help on the menu (tells where the script file is)
'Set opacity to 60%', # "Additional information" in the PDB browser
'Me','Myself','2018', # Copyright/author info, normally
'60%', # the menu item
"RGB*, GRAY*", # Enable only on RGB and grayscale image (wouldn't work on color-indexed)
# The two parameters to the script, set automatically with current image/layer
[
(PF_IMAGE, "image", "Input image", None),
(PF_DRAWABLE, "drawable", "Input drawable", None)
],
[],
opacity60, # the function above in "def opacity60(image,layer)..."
menu="<Image>/Layer/Opacity", # the menu in which you'll hjave the '60%' item above
)
# Barebones version for 100%
register(
'opacity100','','','','','','100%','RGB*, GRAY*',
[(PF_IMAGE, "image", "Input image", None),(PF_DRAWABLE, "drawable", "Input drawable", None)],[],
opacity100,menu="<Image>/Layer/Opacity"
)
main()
As you can see:
- there are more comments than code
- for such a simple function telling Gimp how to call the code is more complicated than the code itself.
PS: VBA, really?