#!/usr/bin/env python
from gimpfu import *
import os,sys,traceback,re,codecs
from itertools import islice
class Channel:
def __init__(self,name,samples):
self.name=str(name) # Never unicode
self.samples=samples
class Setting:
def __init__(self,name,time,channels):
self.name=name
self.time=time
self.channels=channels
def extract(pattern,line):
matched=re.match(pattern,line.strip())
return matched.group(1) if matched else None
def readChannel(settingsFile,channelName):
nameLine,_,typeLine,pointsLine,pointsTypeLine,samplesCountLine,samplesLine=islice(settingsFile,7)
#pdb.gimp_message("nameline" + nameLine)
#pdb.gimp_message("typeLine" + typeLine)
#pdb.gimp_message("pointsLine" + pointsLine)
#pdb.gimp_message(pointsTypeLine)
#pdb.gimp_message(samplesCountLine)
#pdb.gimp_message(samplesLine)
actualName=extract(r'\(channel (\w+)\)',nameLine)
#pdb.gimp_message(actualName)
if actualName!=channelName:
#pdb.gimp_message("1")
pdb.gimp_message("Channel name mismatch: expected: "+channelName+", actual: "+actualName)
if pointsLine.strip()=='(points 4 0 0 1 1)': # identity for channel
#pdb.gimp_message("2")
return Channel(channelName,None)
#pdb.gimp_message("3")
samplesCount=int(extract(r'\(n-samples (\d+)\)',samplesCountLine))
samplesString=extract(r'\(samples \d+ ([0-9. ]+)\)',samplesLine) # skip count value
samples=[float(x) for x in samplesString.split()]
if len(samples)!=samplesCount:
raise Exception("Samples count mismatch: expected: %d, actual: %d" % (samplesCount,len(samples)))
return Channel(channelName,samples)
def readSetting(settingsFile):
try:
#pdb.gimp_message("readSetting try")
# nameLine,timeLine,linearLine=islice(settingsFile,3)
nameLine,timeLine=islice(settingsFile,2)
#pdb.gimp_message("nameLine" + nameLine)
#pdb.gimp_message("timeLine" + timeLine)
##pdb.gimp_message("linearLine" + linearLine)
except:
#pdb.gimp_message("readSetting Valueerror")
return None
#pdb.gimp_message("readSetting settingNameTime")
#pdb.gimp_message(nameLine)
#pdb.gimp_message(timeLine)
settingName=extract(r'\(GimpCurvesConfig "(.+)"',nameLine)
settingTime=int(extract(r'\(time (\d+)\)',timeLine))
#pdb.gimp_message("readSetting after settingNameTime")
channels=[]
for channelName in ["value","red","green","blue","alpha"]:
#pdb.gimp_message("channelName in list")
channel=readChannel(settingsFile,channelName)
if channel.samples:
channels.append(channel) # Don't add identity channels
#pdb.gimp_message("done")
return Setting(settingName,settingTime,channels)
def settingsFrom(settingsFile):
# Skip top two lines
#pdb.gimp_message("inside settingsFrom")
_,_=islice(settingsFile,2)
while True:
try:
setting=readSetting(settingsFile)
except:
setting = None
#pdb.gimp_message("settings after readSetting")
if not setting:
break
yield setting
def load(settingsFilePath):
settings=[]
#pdb.gimp_message("inside load")
with codecs.open(settingsFilePath, 'r', encoding='utf-8') as settingsFile:
#pdb.gimp_message("before settings From")
for setting in settingsFrom(settingsFile):
#pdb.gimp_message("for loop inside Settings from")
if setting.time==0: # Only named settings
#pdb.gimp_message("setting.time==0")
settings.append(setting)
return settings
# if __name__=="__main__":
# settings=load("./GimpCurvesConfig.settings")
# for s in settings:
# print "### %s" % s.name
# for c in s.channels:
# print " %s: %d" % (c.name,len(c.samples))
# for sample in c.samples[:5]:
# print " %7.5f" % sample
def python_cc_test(image,layer):
pdb.gimp_image_undo_group_start(image)
# pdb.gimp_context_push()
#YOUR CODE BEGINS=======================
#CHANGE BELOW to POINT TO YOUR OWN Color Curves Settings
settings=load("C:\\Users\\tintran\\AppData\\Roaming\\GIMP\\2.10\\curves\\GimpCurvesConfig.settings")
pdb.gimp_message(settings[0].name)
pdb.gimp_message(settings[0].time)
pdb.gimp_message(settings[0].channels[0].name) #value channel
pdb.gimp_message(settings[0].channels[1].name) #red channel
pdb.gimp_message(settings[0].channels[1].samples) #red channel
redchannel_samples = settings[0].channels[1].samples
pdb.gimp_drawable_curves_explicit(layer,HISTOGRAM_RED,len(redchannel_samples),redchannel_samples)
# for s in settings:
# #pdb.gimp_message("### " + str(s.name))
# for c in s.channels:
# #pdb.gimp_message(" "+c.name+":"+" "+str(len(c.samples)))
# for sample in c.samples[:5]:
# #pdb.gimp_message(" "+str(sample))
##pdb.gimp_message(get4Points(ovectors))
#YOUR CODE ENDS ========================
# pdb.gimp_context_pop()
pdb.gimp_image_undo_group_end(image)
pdb.gimp_displays_flush()
register(
"python_fu_cc_test",
"Color Curves Test",
"Color Curves Test",
"TT",
"TT",
"2024.1.25",
"<Image>/Python-Fu/A CC Test...",
"*", # Create a new image, don't work on an existing one
[
#INPUT BEGINS
#INPUT ENDS
],
[],
python_cc_test)
main()