I finished my OOBS filter and I fixed the issue with the previous version. Didn’t want to add blending modes to the filter as the main purpose is to use different blur, sharpen parameters over individual channels or all of the channel at once. The overblur, and overline filter came exactly from the PDN varient of those. You can make a new layer with the image you want to apply the OOBS to, and then use blending mode on that layer in your respective software.
#@gui Channel Overblur/Overline/Blur/Sharpen: fx_OOBS, _fx_OOBS_preview(0)
#@gui : sep = separator()
#@gui : 1. Color Space = choice("RGB/sRGB","HSV/HSV8","HSL/HSL8","HSI/HSI8","LCH/LCH8","Lab/Lab8","YCbCr/YCbCrGLIC","YIQ/YIQ8","YUV/YUV8","XYZ/XYZ8")
#@gui : 2. Alt Choice = bool(0)
#@gui : sep = separator()
#@gui : note = note("Configuration for OOBS filter")
#@gui : 3. Use Master Editor(Manipulate multiple channels at once?) = bool(1)
#@gui : 4. Edit Channel #1? = bool(1)
#@gui : 5. Edit Channel #2? = bool(1)
#@gui : 6. Edit Channel #3? = bool(1)
#@gui : 7. Edit Alpha Channel? = bool(0)
#@gui : sep = separator()
#@gui : note = note("<b>Master Editor</b>")
#@gui : 8. Overblur/Overline/Sharpen/Blur = choice ("Overblur","Overline","Blur","Sharpen")
#@gui : 9. Effect Factor = float (1,.1,100)
#@gui : 10. Multiplication Factor = float (1,.1,10)
#@gui : 11. Effect Opacity = float (100,.01,100)
#@gui : sep = separator(), note = note("<u>Individual Channels</u>"), sep = separator()
#@gui : note = note("<b>Channel #1</b>")
#@gui : 12. Overblur/Overline/Sharpen/Blur = choice ("Overblur","Overline","Blur","Sharpen")
#@gui : 13. Effect Factor = float (1,.1,10)
#@gui : 14. Multiplication Factor = float (1,.1,10)
#@gui : 15. Effect Opacity = float (100,.01,100)
#@gui : sep = separator()
#@gui : note = note("<b>Channel #2</b>")
#@gui : 16. Overblur/Overline/Sharpen/Blur = choice ("Overblur","Overline","Blur","Sharpen")
#@gui : 17. Effect Factor = float (1,.1,10)
#@gui : 18. Multiplication Factor = float (1,.1,10)
#@gui : 19. Effect Opacity = float (100,.01,100)
#@gui : sep = separator()
#@gui : note = note("<b>Channel #3</b>")
#@gui : 20. Overblur/Overline/Sharpen/Blur = choice ("Overblur","Overline","Blur","Sharpen")
#@gui : 21. Effect Factor = float (1,.1,10)
#@gui : 22. Multiplication Factor = float (1,.1,10)
#@gui : 23. Effect Opacity = float (100,.01,100)
#@gui : sep = separator()
#@gui : note = note("<b>Alpha Channel</b>")
#@gui : 24. Overblur/Overline/Sharpen/Blur = choice ("Overblur","Overline","Blur","Sharpen")
#@gui : 25. Effect Factor = float (1,.1,10)
#@gui : 26. Multiplication Factor = float (1,.1,10)
#@gui : 27. Effect Opacity = float (100,.01,100)
#@gui : sep = separator(), Preview type = choice("Full","Forward horizontal","Forward vertical","Backward horizontal","Backward vertical","Duplicate top","Duplicate left","Duplicate bottom","Duplicate right","Duplicate horizontal","Duplicate vertical","Checkered","Checkered inverse")
#@gui : sep = separator(), note = note("<small>Author : <i>Reptorian</i> Latest update: <i>2019/01/7</i>.</small>")
fx_OOBS:
split_opacity
local[0]
if {$2==0}
if ($1==1} rgb2hsv
elif ($1==2} rgb2hsl
elif ($1==3} rgb2hsi
elif ($1==4} rgb2lch
elif ($1==5} rgb2lab
elif ($1==6} rgb2ycbcr
elif ($1==7} rgb2yiq
elif ($1==8} rgb2yuv
elif ($1==9} rgb2xyz
fi
elif {$2==1}
if {$1==0} rgb2srgb
elif {$1==1} rgb2hsv8
elif {$1==2} rgb2hsl8
elif {$1==3} rgb2hsi8
elif {$1==4} rgb2lch8
elif {$1==5} rgb2lab8
elif {$1==6} rgb2ycbcrglic
elif {$1==7} rgb2yiq8
elif {$1==8} rgb2yuv8
elif {$1==9} rgb2xyz8
fi fi
s c
if {$3==1}
if {$4==1} local[0] +oobs_edit[0] $8,$9,$10 -blend[0,1] normal,$11/100 endl fi
if {$5==1} local[1] +oobs_edit[0] $8,$9,$10 -blend[0,1] normal,$11/100 endl fi
if {$6==1} local[2] +oobs_edit[0] $8,$9,$10 -blend[0,1] normal,$11/100 endl fi
elif {$3==0}
if {$4==1} local[0] +oobs_edit[0] $12,$13,$14 -blend[0,1] normal,$15/100 endl fi
if {$5==1} local[1] +oobs_edit[0] $16,$17,$18 -blend[0,1] normal,$19/100 endl fi
if {$6==1} local[2] +oobs_edit[0] $20,$21,$22 -blend[0,1] normal,$23/100 endl fi
fi
a c
if {$2==0}
if ($1==1} hsv2rgb
elif ($1==2} hsl2rgb
elif ($1==3} hsi2rgb
elif ($1==4} lch2rgb
elif ($1==5} lab2rgb
elif ($1==6} ycbcr2rgb
elif ($1==7} yiq2rgb
elif ($1==8} yuv2rgb
elif ($1==9} xyz2rgb
fi
elif {$2==1}
if {$1==0} srgb2rgb
elif {$1==1} hsv82rgb
elif {$1==2} hsl82rgb
elif {$1==3} hsi82rgb
elif {$1==4} lch82rgb
elif {$1==5} lab82rgb
elif {$1==6} ycbcrglic2rgb
elif {$1==7} yiq82rgb
elif {$1==8} yuv82rgb
elif {$1==9} xyz82rgb
fi fi
endl
local[1]
if {$3==1} +oobs_edit[0] $8,$9,$10 -blend[0,1] multiply,$11/100
elif {$3==0} +oobs_edit[0] $23,$24,$25 -blend[0,1] multiply,$26/100
fi
endl
a c
oobs_edit :
if {$1==0} -overblur_overline[0] 0,$2,$3 fi
if {$1==1} -overblur_overline[0] 1,$2,$3 fi
if {$1==2} -blur[0] {$2*$3} fi
if {$1==3} -sharpen[0] {$2*$3} fi
overblur_overline :
if {$1==0} +blur[0] $2
elif {$1==1} +sharpen[0] $2
fi
+blend[0,1] difference
mul[2] $3
remove[1]
-blend[0,1] add
_fx_OOBS_preview :
gui_split_preview "fx_OOBS ${1--2}",$-1
With the help of the OOBS filter
It’s really not that great of a filter, but maybe there will be a use of it. At least you can manipulate multiple channels at once and use overline or overblur instead. I do think it may actually have a place for manipulating fractal pictures. Not for generic editing. I might try to make it better by implementing blending mode, but I’ll do that later.
Also, made some more bugfixes on the Vibrato filter. I think this one actually works completely. I had forgotten $ placement in some areas. I removed the numbers as it’s complete.
#@gui Vibrato: fx_vibrato, _fx_vibrato_preview(0)
#@gui : note = note("This is the advanced version of the Vibrato filter. If you do want to manipulate multiple channels at once, use <u>Vibrato - Basic</u> filter. <i>Note: Disable channel mulplication for non-transparent images.</i> \n\n")
#@gui : note = note("This filter is the one of the G'MIC version of <b>MadJik's</b> <i>Paint.NET plugin</i>")
#@gui : sep = separator()
#@gui : Colour Space = choice("RGB", "CMY", "HSI", "HSL", "HSV", "LAB", "LCH", "YCbCr", "YCbCr-Glic", "YUV", "YIQ", "XYZ", "Bayer")
#@gui : sep = separator()
#@gui : Manipulate multiple channels at once? = bool(1)
#@gui : Process Channel 1? = bool(1)
#@gui : Process Channel 2? = bool(1)
#@gui : Process Channel 3? = bool(1)
#@gui : Process Alpha Channel? = bool(1)
#@gui : Inherit Alpha? = bool(1)
#@gui : X-Orientation = bool(1)
#@gui : Y-Orientation = bool(1)
#@gui : U- Factor = float(.85,.1,15)
#@gui : V- Factor = float(.85,.1,15)
#@gui : X-Scale Factor = float(1,.1,15)
#@gui : Y-Scale Factor = float(1,.1,15)
#@gui : XY-Scale Factor = float(1,.1,3)
#@gui : Percentage-Based X Pixel Shift = float(0,-200,200)
#@gui : Percentage-Based Y Pixel Shift = float(0,-200,200)
#@gui : Elevation = float(.7,-100,100)
#@gui : Multiply Blending = bool(0)
#@gui : Invert Vibrato = bool(0)
#@gui : Vibrato Blending Factor = float (100,0,100)
#@gui : Channel Influence Factor = float(1,-8,8)
#@gui : Final Channel Modulos Multiplication Factor = float(1,1,32)
#@gui : sep = separator()
#@gui : note = note("- <b>Channel #1</b> - ")
#@gui : Process Channel? = bool(1)
#@gui : X-Orientation = bool(1)
#@gui : Y-Orientation = bool(1)
#@gui : U-Factor = float(.85,.1,15)
#@gui : V-Factor = float(.85,.1,15)
#@gui : X-Scale Factor = float(1,.1,15)
#@gui : Y-Scale Factor = float(1,.1,15)
#@gui : XY-Scale Factor = float(1,.1,3)
#@gui : Percentage-Based X Pixel Shift = float(0,-200,200)
#@gui : Percentage-Based Y Pixel Shift = float(0,-200,200)
#@gui : Elevation = float(.7,-100,100)
#@gui : Multiply Blending = bool(0)
#@gui : Invert Vibrato = bool(0)
#@gui : Vibrato Blending Factor = float (100,0,100)
#@gui : Channel Influence Factor = float(1,-8,8)
#@gui : Final Channel Modulos Multiplication Factor = float(1,1,32)
#@gui : sep = separator()
#@gui : note = note("- <b>Channel #2</b> - ")
#@gui : Process Channel? = bool(1)
#@gui : X-Orientation = bool(1)
#@gui : Y-Orientation = bool(1)
#@gui : U-Factor = float(.85,.1,15)
#@gui : V-Factor = float(.85,.1,15)
#@gui : X-Scale Factor = float(1,.1,15)
#@gui : Y-Scale Factor = float(1,.1,15)
#@gui : XY-Scale Factor = float(1,.1,3)
#@gui : Percentage-Based X Pixel Shift = float(0,-200,200)
#@gui : Percentage-Based Y Pixel Shift = float(0,-200,200)
#@gui : Elevation = float(.7,-100,100)
#@gui : Multiply Blending = bool(0)
#@gui : Invert Vibrato = bool(0)
#@gui : Vibrato Blending Factor = float (100,0,100)
#@gui : Channel Influence Factor = float(1,-8,8)
#@gui : Final Channel Modulos Multiplication Factor = float(1,1,32)
#@gui : sep = separator()
#@gui : note = note("- <b>Channel #3</b> - ")
#@gui : Process Channel? = bool(1)
#@gui : X-Orientation = bool(1)
#@gui : Y-Orientation = bool(1)
#@gui : U-Factor = float(.85,.1,15)
#@gui : V-Factor = float(.85,.1,15)
#@gui : X-Scale Factor = float(1,.1,15)
#@gui : Y-Scale Factor = float(1,.1,15)
#@gui : XY-Scale Factor = float(1,.1,3)
#@gui : Percentage-Based X Pixel Shift = float(0,-200,200)
#@gui : Percentage-Based Y Pixel Shift = float(0,-200,200)
#@gui : Elevation = float(.7,-100,100)
#@gui : Multiply Blending = bool(0)
#@gui : Invert Vibrato = bool(0)
#@gui : Vibrato Blending Factor = float (100,0,100)
#@gui : Channel Influence Factor = float(1,-8,8)
#@gui : Final Channel Modulos Multiplication Factor = float(1,1,32)
#@gui : sep = separator()
#@gui : note = note("- <b>Alpha Channel #1</b> - ")
#@gui : Process Channel? = bool(0)
#@gui : X-Orientation = bool(1)
#@gui : Y-Orientation = bool(1)
#@gui : U-Factor = float(.85,.1,15)
#@gui : V-Factor = float(.85,.1,15)
#@gui : X-Scale Factor = float(1,.1,15)
#@gui : Y-Scale Factor = float(1,.1,15)
#@gui : XY-Scale Factor = float(1,.1,3)
#@gui : Percentage-Based X Pixel Shift = float(0,-200,200)
#@gui : Percentage-Based Y Pixel Shift = float(0,-200,200)
#@gui : Elevation = float(.7,-100,100)
#@gui : Multiply Blending = bool(1)
#@gui : Invert Vibrato = bool(0)
#@gui : Vibrato Blending Factor = float (100,0,100)
#@gui : Channel Influence Factor = float(1,-8,8)
#@gui : Final Channel Modulos Multiplication Factor = float(1,1,32)
#@gui : sep = separator(), Preview type = choice("Full","Forward horizontal","Forward vertical","Backward horizontal","Backward vertical","Duplicate top","Duplicate left","Duplicate bottom","Duplicate right","Duplicate horizontal","Duplicate vertical","Checkered","Checkered inverse")
#@gui : sep = separator(), note = note("<small>Author : <i>Reptorian</i> Latest update: <i>2018/12/19</i>.</small>")
fx_vibrato:
split_opacity
local[0]
if {$1==1} rgb2cmy
elif {$1==2} rgb2hsi8
elif {$1==3} rgb2hsl8
elif {$1==4} rgb2hsv8
elif {$1==5} rgb2lab8
elif {$1==6} rgb2lch8
elif {$1==7} rgb2ycbcr
elif {$1==8} rgb2ycbcrglic
elif {$1==9} rgb2yuv8
elif {$1==10} rgb2yiq8
elif {$1==11} rgb2xyz8
elif {$1==12} rgb2bayer 0
fi
s c
if {$2==1}
if {$3==1} -vibrato[0] $8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22 fi
if {$4==1} -vibrato[1] $8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22 fi
if {$5==1} -vibrato[2] $8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22 fi
elif {$2==0}
if {$23==1} -vibrato[0] $24,$25,$26,$27,$28,$29,$30,$31,$32,$33,$34,$35,$36,$37,$38 fi
if {$39==1} -vibrato[1] $40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$50,$51,$52,$53,$54 fi
if {$55==1} -vibrato[2] $56,$57,$58,$59,$60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$70 fi
fi
a c
if {$1==1} cmy2rgb
elif {$1==2} hsi82rgb
elif {$1==3} hsl82rgb
elif {$1==4} hsv82rgb
elif {$1==5} lab82rgb
elif {$1==6} lch82rgb
elif {$1==7} ycbcr2rgb
elif {$1==8} ycbcrglic2rgb
elif {$1==9} yuv82rgb
elif {$1==10} yiq82rgb
elif {$1==11} xyz82rgb
elif {$1==12} bayer2rgb 0,0,0
fi
endl
if {$2==1}
if {$6==1} -vibrato[1] $8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$7,$19,$20,$21,$22 fi
elif {$2==0}
if {$71==1} -vibrato[1] $72,$73,$74,$75,$76,$77,$78,$79,$80,$81,$82,$83,$84,$85,$86 fi
fi
a c
vibrato:
repeat $! l[$>]
n 0,255
f "
q=($8/100)*w;
l=($9/100)*h;
X=(($1?w-x+q:x+q)/w-.5) * 2 * 1/$5 * 1/$7;
Y=(($2?h-y+l:y+l)/h-.5) * 2 * 1/$6 * 1/$7;
U=sqrt($3);
V=sqrt($4);
Z=((X-Y) * (X-U) * (X+U) * (Y-V) * (Y+V))+ $10;
C=(Z+((1-i/255)/(($3>1?$3:1/$3)*($4>1?$4:1/$4)))*$14)*(Z+((1-i/255)/(($3>1?$3:1/$3)*($4>1?$4:1/$4)))*$14);
F=abs(C)>1?C-int(C):C;
A=$12?F:1-F;
B=$11?(i*A):A*200;
E=$13/100*B+(1-$13/100)*i;
" n 0,255 mul $15 mod 256
endl done
_fx_vibrato_preview :
gui_split_preview "fx_vibrato ${1--2}",$-1
New filter as of 1/9/2019
#@gui Emboss/Relief : fx_emboss_relief, fx_emboss_relief_preview(0)
#@gui : sep = separator()
#@gui : Smoothness = float(0,0,10)
#@gui : Emboss Angle = float(0,0,360)
#@gui : Level 1 Depth Boost = float(0,0,1)
#@gui : Level 2 Depth Boost = float(0,0,1)
#@gui : Preserve Alpha? = bool(1)
#@gui : sep = separator(), note = note("Relief Section")
#@gui : Apply relief? = bool(1)
#@gui : Blending Mode = choice(0,"Grain Extract","Grain Merge")
#@gui : Blending Opacity = float(1,0,1)
#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0)
#@gui : sep = separator(), note = note("<small>Author: Reptorian. Latest Update: <i>2019/1/9</i>.</small>")
fx_emboss_relief :
if {$6==1} split_opacity
+fx_emboss $1,$2,$3,$4,0
if {$7==0} blend[0,2] grainextract,$8
elif {$7==1} blend[0,2] grainmerge,$8 fi
if {$5==0} rm[1]
elif {$5==1} a c fi
elif {$6==0} fx_emboss $1,$2,$3,$4,$5 fi
fx_emboss :
split_opacity
emboss_image[0] $1,$2,$3,$4
if {$5==0} rm[1]
elif {$5==1} a c fi
emboss_image :
luminance
fx_gradient2rgb $1,0,100,0,0
_hue_rotation $2
+_hue_rotation 180
_angle_result[0] 0
_angle_result[1] 1
+fill_color 127.5,127.5,127.5,255
blend grainmerge
[0]
blend grainmerge,$3
[0]
blend grainmerge,$4
_angle_result :
to_rgb
s c
rm[1,2]
if {$1==0} n 128,255
elif {$1==1} negate n 0,128 fi
_hue_rotation :
rgb2hsv s c
local[0]
f "H=$1;H+i-(floor((H+i)/360)*360)"
endl
a c
hsv2rgb
fx_emboss_relief_preview :
gui_split_preview "fx_emboss_relief $*",${-3--1}
Emboss Before/After
This is meant for texture artists. Also, Krita users now have a better embossing filter than the one in the program.
And here’s my first cli command
#@cli sol8: : eq. to 'solarize8'.
#@cli : Solarize image using 8-bit values
sol8 :
f "i>127.5?255-i:i" mul 2
EDIT: Combined relief and emboss into one filter.
Before/After -