 |
| GimpChat Member |
Joined: Sep 29, 2016 Posts: 11
|
Necroposting, but, updated version that works with 3.2.4: #!/usr/bin/env python3
# david2_lum_mask.py # following the steps described on this link's pdf by david: https://gimplearn.net/viewtopic.php?p=29419#p29419 # Created by Tin Tran https://gimplearn.net # Comments directed to https://gimplearn.net # # After being created, that ungrateful wretch, david, modified it by adding layers LLLL. # DDDD and replacing M with a medium dark (MD) and medium light (ML). # # License: GPLv3 # 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, either version 3 of the License, or # (at your option) any later version. # # 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. # # To view a copy of the GNU General Public License # visit: http://www.gnu.org/licenses/gpl.html # # # ------------ #| Change Log | # ------------ # Rel 1: Initial release. # Rel 2: DM 23 November 2019. # Rel 3: updated for GIMP 3.2.4 # -*- coding: utf-8 -*- import sys import gi gi.require_version('Gimp', '3.0') from gi.repository import Gimp from gi.repository import GLib from gi.repository import GObject gi.require_version('Gegl', '0.4') from gi.repository import Gegl
def python_david2_lum_mask(image, layer): image.undo_group_start() Gimp.context_push() # Make a copy of the layer to desaturate layer_copy = Gimp.Layer.new_from_drawable(layer, image) image.insert_layer(layer_copy, None, 0) layer_copy.equalize(True) # In GIMP 3, desaturate is a method of Gimp.Drawable layer_copy.desaturate(Gimp.DesaturateMode.LUMINANCE)
# Copy Red channel as L1 channel_L1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "L1") image.insert_channel(channel_L1, None, 0)
# Create D1 from Alpha subtract L1 channel_D1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "D1") image.insert_channel(channel_D1, None, 0) channel_D1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DD1 from Alpha - L1 - L1 channel_DD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DD1") image.insert_channel(channel_DD1, None, 0) channel_DD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDD1 from Alpha - L1 - L1 - L1 channel_DDD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDD1") image.insert_channel(channel_DDD1, None, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDDD1 from Alpha - L1 - L1 - L1 - L1 channel_DDDD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDDD1") image.insert_channel(channel_DDDD1, None, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDDD from Alpha - L1 - L1 - L1 - L1 - L1 channel_DDDD = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDDD") image.insert_channel(channel_DDDD, None, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LL1 from RED_CHANNEL - D1 channel_LL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LL1") image.insert_channel(channel_LL1, None, 0) channel_LL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLL1 from RED_CHANNEL - D1 - D1 channel_LLL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLL1") image.insert_channel(channel_LLL1, None, 0) channel_LLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLLL1 from RED_CHANNEL - D1 - D1 - D1 channel_LLLL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLLL1") image.insert_channel(channel_LLLL1, None, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLLL from RED_CHANNEL - D1 - D1 - D1 - D1 channel_LLLL = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLLL") image.insert_channel(channel_LLLL, None, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create ML from D1 - DD1 - DD1 channel_ML = channel_D1.copy() image.insert_channel(channel_ML, None, 0) channel_ML.set_name("ML") channel_ML.combine_masks(channel_DD1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_ML.combine_masks(channel_DD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create MD from L1 - LL1 - LL1 channel_MD = channel_L1.copy() image.insert_channel(channel_MD, None, 0) channel_MD.set_name("MD") channel_MD.combine_masks(channel_LL1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_MD.combine_masks(channel_LL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create D from DD1 - DDD1 channel_D = channel_DD1.copy() image.insert_channel(channel_D, None, 0) channel_D.set_name("D") channel_D.combine_masks(channel_DDD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DD from DDD1 - DDDD1 channel_DD = channel_DDD1.copy() image.insert_channel(channel_DD, None, 0) channel_DD.set_name("DD") channel_DD.combine_masks(channel_DDDD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDD from DDDD1 - DDDD channel_DDD = channel_DDDD1.copy() image.insert_channel(channel_DDD, None, 0) channel_DDD.set_name("DDD") channel_DDD.combine_masks(channel_DDDD, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create L from LL1 - LLL1 channel_L = channel_LL1.copy() image.insert_channel(channel_L, None, 0) channel_L.set_name("L") channel_L.combine_masks(channel_LLL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LL from LLL1 - LLLL1 channel_LL = channel_LLL1.copy() image.insert_channel(channel_LL, None, 0) channel_LL.set_name("LL") channel_LL.combine_masks(channel_LLLL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLL from LLLL1 - LLLL channel_LLL = channel_LLLL1.copy() image.insert_channel(channel_LLL, None, 0) channel_LLL.set_name("LLL") channel_LLL.combine_masks(channel_LLLL, Gimp.ChannelOps.SUBTRACT, 0, 0)
Gimp.Selection.none(image) image.remove_layer(layer_copy)
# Helper to create a layer with a channel mask def create_mask_layer(channel, name): image.select_item(Gimp.ChannelOps.REPLACE, channel) new_layer = Gimp.Layer.new_from_drawable(layer, image) image.insert_layer(new_layer, None, 0) new_layer.set_name(name) mask = new_layer.create_mask(Gimp.AddMaskType.SELECTION) new_layer.add_mask(mask)
# Create layers with masks create_mask_layer(channel_DDDD, "DDDD") create_mask_layer(channel_DDD, "DDD") create_mask_layer(channel_DD, "DD") create_mask_layer(channel_D, "D") create_mask_layer(channel_MD, "MD") create_mask_layer(channel_ML, "ML") create_mask_layer(channel_L, "L") create_mask_layer(channel_LL, "LL") create_mask_layer(channel_LLL, "LLL") create_mask_layer(channel_LLLL, "LLLL")
# Remove all channels for ch in [channel_L1, channel_LL1, channel_LLL1, channel_LLLL1, channel_L, channel_LL, channel_LLL, channel_LLLL, channel_D1, channel_DD1, channel_DDD1, channel_DDDD1, channel_D, channel_DD, channel_DDD, channel_DDDD, channel_ML, channel_MD]: image.remove_channel(ch)
Gimp.Selection.none(image) Gimp.context_pop() image.undo_group_end() Gimp.displays_flush()
class David2LumMaskPlugin(Gimp.PlugIn): def do_query_procedures(self): return ["python-fu-david2-lum-mask"]
def do_create_procedure(self, name): procedure = Gimp.ImageProcedure.new(self, name, Gimp.PDBProcType.PLUGIN, self.run, None) procedure.set_image_types("RGB*, GRAY*") procedure.set_menu_label("David2 Luminosity Masks...") procedure.add_menu_path("<Image>/Python-Fu/") procedure.set_documentation("Create Luminosity Masks", "Create Luminosity Masks", "David Marsden") procedure.set_attribution("David Marsden", "David Marsden", "December 2019") return procedure
def run(self, procedure, run_mode, image, drawables, config, run_data): if len(drawables) != 1: return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR, GLib.Error("Procedure requires one layer.")) layer = drawables[0] python_david2_lum_mask(image, layer) return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Gimp.main(David2LumMaskPlugin.__gtype__, sys.argv)
And a version that just makes channels instead of making image layers (my preference): # david2_lum_mask.py # following the steps described on this link's pdf by david: https://gimplearn.net/viewtopic.php?p=29419#p29419 # Created by Tin Tran https://gimplearn.net # Comments directed to https://gimplearn.net # # After being created, that ungrateful wretch, david, modified it by adding layers LLLL. # DDDD and replacing M with a medium dark (MD) and medium light (ML). # # License: GPLv3 # 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, either version 3 of the License, or # (at your option) any later version. # # 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. # # To view a copy of the GNU General Public License # visit: http://www.gnu.org/licenses/gpl.html # # # ------------ #| Change Log | # ------------ # Rel 1: Initial release. # Rel 2: DM 23 November 2019. # Rel 3: updated for GIMP 3.2.4 #!/usr/bin/env python3 # -*- coding: utf-8 -*-
import sys import gi gi.require_version('Gimp', '3.0') from gi.repository import Gimp from gi.repository import GLib from gi.repository import GObject gi.require_version('Gegl', '0.4') from gi.repository import Gegl
def python_david2_lum_mask(image, layer): image.undo_group_start() Gimp.context_push()
# Make a copy of the layer to desaturate layer_copy = Gimp.Layer.new_from_drawable(layer, image) image.insert_layer(layer_copy, None, 0) layer_copy.equalize(True) layer_copy.desaturate(Gimp.DesaturateMode.LUMINANCE)
# Copy Red channel as L1 channel_L1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "L1") image.insert_channel(channel_L1, None, 0)
# Create D1 from Alpha subtract L1 channel_D1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "D1") image.insert_channel(channel_D1, None, 0) channel_D1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DD1 from Alpha - L1 - L1 channel_DD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DD1") image.insert_channel(channel_DD1, None, 0) channel_DD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDD1 from Alpha - L1 - L1 - L1 channel_DDD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDD1") image.insert_channel(channel_DDD1, None, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDDD1 from Alpha - L1 - L1 - L1 - L1 channel_DDDD1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDDD1") image.insert_channel(channel_DDDD1, None, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD1.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDDD from Alpha - L1 - L1 - L1 - L1 - L1 channel_DDDD = Gimp.Channel.new_from_component(image, Gimp.ChannelType.ALPHA, "DDDD") image.insert_channel(channel_DDDD, None, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_DDDD.combine_masks(channel_L1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LL1 from RED_CHANNEL - D1 channel_LL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LL1") image.insert_channel(channel_LL1, None, 0) channel_LL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLL1 from RED_CHANNEL - D1 - D1 channel_LLL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLL1") image.insert_channel(channel_LLL1, None, 0) channel_LLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLLL1 from RED_CHANNEL - D1 - D1 - D1 channel_LLLL1 = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLLL1") image.insert_channel(channel_LLLL1, None, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL1.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLLL from RED_CHANNEL - D1 - D1 - D1 - D1 channel_LLLL = Gimp.Channel.new_from_component(image, Gimp.ChannelType.RED, "LLLL") image.insert_channel(channel_LLLL, None, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_LLLL.combine_masks(channel_D1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create ML from D1 - DD1 - DD1 channel_ML = channel_D1.copy() image.insert_channel(channel_ML, None, 0) channel_ML.set_name("ML") channel_ML.combine_masks(channel_DD1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_ML.combine_masks(channel_DD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create MD from L1 - LL1 - LL1 channel_MD = channel_L1.copy() image.insert_channel(channel_MD, None, 0) channel_MD.set_name("MD") channel_MD.combine_masks(channel_LL1, Gimp.ChannelOps.SUBTRACT, 0, 0) channel_MD.combine_masks(channel_LL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create D from DD1 - DDD1 channel_D = channel_DD1.copy() image.insert_channel(channel_D, None, 0) channel_D.set_name("D") channel_D.combine_masks(channel_DDD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DD from DDD1 - DDDD1 channel_DD = channel_DDD1.copy() image.insert_channel(channel_DD, None, 0) channel_DD.set_name("DD") channel_DD.combine_masks(channel_DDDD1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create DDD from DDDD1 - DDDD channel_DDD = channel_DDDD1.copy() image.insert_channel(channel_DDD, None, 0) channel_DDD.set_name("DDD") channel_DDD.combine_masks(channel_DDDD, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create L from LL1 - LLL1 channel_L = channel_LL1.copy() image.insert_channel(channel_L, None, 0) channel_L.set_name("L") channel_L.combine_masks(channel_LLL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LL from LLL1 - LLLL1 channel_LL = channel_LLL1.copy() image.insert_channel(channel_LL, None, 0) channel_LL.set_name("LL") channel_LL.combine_masks(channel_LLLL1, Gimp.ChannelOps.SUBTRACT, 0, 0)
# Create LLL from LLLL1 - LLLL channel_LLL = channel_LLLL1.copy() image.insert_channel(channel_LLL, None, 0) channel_LLL.set_name("LLL") channel_LLL.combine_masks(channel_LLLL, Gimp.ChannelOps.SUBTRACT, 0, 0)
Gimp.Selection.none(image) image.remove_layer(layer_copy)
# Make the final luminosity-mask channels invisible so they don't # overlay a red tint on the canvas (they remain in the Channels dialog) final_channels = [ channel_DDDD, channel_DDD, channel_DD, channel_D, channel_MD, channel_ML, channel_L, channel_LL, channel_LLL, channel_LLLL, ] for ch in final_channels: ch.set_visible(False)
# Remove only the intermediate (working) channels; keep the final ones for ch in [channel_L1, channel_D1, channel_DD1, channel_DDD1, channel_DDDD1, channel_LL1, channel_LLL1, channel_LLLL1]: image.remove_channel(ch)
Gimp.Selection.none(image) Gimp.context_pop() image.undo_group_end() Gimp.displays_flush()
class David2LumMaskPlugin(Gimp.PlugIn): def do_query_procedures(self): return ["python-fu-david2-lum-mask-channels"]
def do_create_procedure(self, name): procedure = Gimp.ImageProcedure.new(self, name, Gimp.PDBProcType.PLUGIN, self.run, None) procedure.set_image_types("RGB*, GRAY*") procedure.set_menu_label("David2 Luminosity Masks - Channels...") procedure.add_menu_path("<Image>/Python-Fu/") procedure.set_documentation("Create Luminosity Masks - Channels", "Create Luminosity Masks - Channels", "David Marsden") procedure.set_attribution("David Marsden", "David Marsden", "December 2019") return procedure
def run(self, procedure, run_mode, image, drawables, config, run_data): if len(drawables) != 1: return procedure.new_return_values( Gimp.PDBStatusType.CALLING_ERROR, GLib.Error("Procedure requires one layer.")) layer = drawables[0] python_david2_lum_mask(image, layer) return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Gimp.main(David2LumMaskPlugin.__gtype__, sys.argv)
These were bot-updated, but I read through and it looks good (and works well, so far at least).
|
|