Glitch Art Filters?

Updated again. The tile shifting has been added alongside bomb blending (which won’t replace the classic JIFF self-bomb script because that’s quicker). At this point I’ve sorted out almost everything and all that’s left are extras which aren’t in a typical ‘JPEG glitch’ as well as more precise control over what goes on alongside bug fixes. I’ve been casual about batch processing - which the artefacts script can do but mine couldn’t. I’ll take a break and then turn towards that.

image

image

image

A current issue is that it uses quite a lot of memory, enough that it segfaults with anything above half a megapixel on my machine. How do I get it to use less memory? Whatever it is, it’s not in the fill blocks but it’s in the biggest repeat block.

I think I’ve fixed the memory issue, it was caused by the inclusion of a lot of float values. It’s now a lot quicker and I can go above 4 megapixels without RAM problems. There are more things that I want to include to make it really powerful and screwed up, though.

#@gui JFIF Effects : fx_jfif, fx_jfif_preview(0)
#@gui : note = note("<small>A poorly-implemented jfif encoder designed to screw with images. Quite slow and very aggressive.</small>")
#@gui : 1. Quality (%) = int(50,1,100)
#@gui : 2. Encoding = choice(3,"444","442","424","422")
#@gui : sep = separator()
#@gui : note = note("Fake Glitch")
#@gui : 3. Power = float(0,0,10)
#@gui : 4. Colour Distortion = float(1,0,2)
#@gui : 5. Max Glitch Length = int(5,2,10)
#@gui : 6. Tile Error Power = float(0.25,0,1)
#@gui : 7. Persistent Tile Error Power = float(0.25,0,1)
#@gui : 8. Max Value Errors Per Tile = int(5,0,10)
#@gui : 9. Tile Shift Power = float(0.25,0,1)
#@gui : sep = separator()
#@gui : note = note("Self-Bomb")
#@gui : 10. Enable = bool(0)
#@gui : 11. Mesh X = int(16,1,256)
#@gui : 12. Mesh Y = int(16,1,256)
#@gui : 13. Mesh smoothness = float(0.5,0,10)
#@gui : 14. Contrast scheme = choice(1,"Arctan","Clip","Power)
#@gui : 15. Mesh contrast = float(75,0,100)
#@gui : 16. Scale X = float(1,0.05,16)
#@gui : 17. Scale Y = float(1,0.05,16)
#@gui : 18. Interpolation = choice(0,"None","Nearest","Average","Bilinear","Grid","Bicubic")
#@gui : 19. Normalise = bool(0)
#@gui : 20. Output mesh = bool(0)
#@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: Joan Rake, \'borrowed\' from <i><a href="https://goo.gl/Ryf7Cv">David Tschumperl&#233;</a></i>.      Latest Update: <i>2017/05/07</i>.</small>")
fx_jfif :
cd={$4^2.5}
gl=$5
te=$6^2
ste=$7
ve=$8
ts=$9^2
base642img "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"
base642img "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"
nm[-2,-1] dct,idct
i[Q] (16,11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62;18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101;72,92,95,98,112,100,103,99)
f. "const S = $1<50?5000/$1:200-2*$1; max(1,round((S*i+50)/100,1,-1))"
repeat {$!-3} l[$>,-3--1]
gp={(0.25^((10-$3)*log(wh(#0))/30))*$3/10}
if $10
ww={w(#0)}
hh={h(#0)}
r[$>] {$16*100}%,{$17*100}%,100%,100%,$18
fi
i[G] {w(#0)},{h(#0)},1,1 f[$G] ">begin(chance = "$gp"; tlmax="$gl"; tt=-1; val=0; sticky="$ste");
if (!(x%16) && !(y%16),for (l = 0, l<2, ++l, for (k = 0, k<2, ++k, (u<=chance?((val=1);tt=round(u(1,tlmax))):tt>=0?(val=0;--tt):(u<=sticky?(val=-2):val=-1)); j(k*8,l*8)=val)),0)"
l[0] w,h={[w,h]} r {w+(-w%16)},{h+(-h%16)},1,100%,0,3 rgb2srgb gcd_srgb2jpeg s c
if {$2==1} r[-2,-1] 100%,50%,1,1,2 elif {$2==2} r[-2,-1] 50%,100%,1,1,2 elif {$2==3} r[-2,-1] 50%,50%,1,1,2 fi round. endl
bw,bh=8
repeat 3
if {$>==1}
if {$2==1} bh=16 elif {$2==2} bw=16 elif {$2==3} bh,bw=16 fi
fi
[$>]
f[$>] ">begin(boundary = 2; res = vector64(); const cbw="$bw"; const cbh="$bh"; const cbwh=cbw*cbh; glitch=0; cold="$cd"; gval=1; errtile=0; sticky=0; errval="$ve"; tileerr="$te"; tileerror=0);
if (!(x%(128/cbw)) && !(y%(128/cbh)),for (ll = 0, ll<(16/cbw), ++ll, for (kk = 0, kk<(16/cbh), ++kk,
src = crop(x+(ll*8),y+(kk*8),8,8);
gpunch=crop(#"$G",cbw/8*(x+(ll*8)),cbh/8*(y+(ll*8)),cbw,cbh);
max(gpunch)==1?(glitch=1);
glitch==1?(gval=cut(gval+(u(-cold,cold)/15),0,1);(u<=tileerr?tileerror=1);errnum=u(1,errval);for (ve=0,ve<errnum,++ve,src[u(0,63)]=u(-30,30)));
tileerror==1?errtile=u(0,64);
for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = int(sum(gval*src*crop(#"$dct",0,0,(off+errtile)%64,8,8,1)))));
draw(#-1,res,x+(ll*8),y+(kk*8),0,0,8,8);
min(gpunch)<=-1?(glitch=0;errnum=0;tileerror=0;min(gpunch)==-1?errtile=0)))); i"
round.
+r[$Q] {$>,w},100%,1,1,0,2 /.. . round.. *[-2,-1]
dispw={w(#1)}
f. ">begin(boundary = 2; res = vector64(); const cbw="$bw"; const cbh="$bh"; const cbwh=cbw*cbh; glitch=0; cold="$cd"; gval=0; errtile=0; sticky=0; errval="$ve"; tileerr="$te"; tileerror=0; const dispwidth="$dispw";disp=0;shift="$ts";toff=0;tswitch=0);
if (!(x%(128/cbw)) && !(y%(128/cbh)),for (ll = 0, ll<(16/cbw), ++ll, for (kk = 0, kk<(16/cbh), ++kk,
src = crop((x+(ll*8+cbw*disp))%(dispwidth/cbw*16),y+(kk*8)+cbh*floor((x+cbw*disp)/(dispwidth/cbw*16)),8,8);
gpunch=crop(#"$G",cbw/8*(x+(ll*8)),cbh/8*(y+(ll*8)),cbw,cbh);
max(gpunch)==1?(glitch=1);
glitch==1?((u<=shift?++disp);errnum=u(1,errval);gval=cut(gval+(u(-cold,cold)/5),-1,5);(u<=tileerr?tileerror=1;tswitch=1);errnum=u(1,errval);for (ve=0,ve<errnum,++ve,src[u(0,63)]=u(-30,30)));
tileerror==1?(errtile=u(0,64);toff=gval*u(2));
tswitch==1?(for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = int(sum(cut(gval+src*crop(#"$idct",0,0,(off+errtile)%64,8,8,1),gval,10000)))))):(for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = int(sum(gval+src*crop(#"$idct",0,0,(off+(errtile))%64,8,8,1))))));
draw(#"$>",res+toff,x+(ll*8),y+(kk*8),0,0,8,8);
min(gpunch)<=-1?(glitch=0;errnum=0;tileerror=0;min(gpunch)==-1?(errtile=0;tswitch=0))))); i"
rm.
l[$>] r {w*($bw/8)},{h*($bh/8)},1,1,1 endl
round[$>]
done
rm[$G]
l[^4--1] a c gcd_jpeg2srgb srgb2rgb round. r $w,$h,1,3,0
if $10 blend_bomb 1,${11-15},0,0,0,${19-20}
r $ww,$hh,100%,100%,$18 fi
endl
endl done
rm[$dct,$idct,$Q]
fx_jfif_preview :
#fx_jfif $*
gui_split_preview "fx_jfif $*",${-3--1}

I have just tested it, and I’m loving it.

image

It is even better than the one from PDN plugin. I consider it done myself. Your row shifter filter can replace a lot of those filters though there isn’t any way to get the quadratic look to it. So, there’s at least 2 more glitch filters missing. Spiral, and Quadratic, and then it’s all done.

By the way, I found this - https://www.hellocatfood.com/jpg-glitch-pattern-generator/

You should keep and fork the old one if you want since it works absolutely fine but I want to add more tweakability and more meaningful options. This newer version is quite a bit slower again (though not as bad as it was before I fixed it last time) but it’s far more configurable and doesn’t come with those older tile errors which were a bit hard to manage.

#@gui JFIF Effects : fx_jfif, fx_jfif_preview(0)
#@gui : note = note("<small>A poorly-implemented JFIF encoder with extras, all designed to screw with images. Quite slow and very aggressive.</small>")
#@gui : 1. Quality (%) = int(50,1,100)
#@gui : 2. Encoding = choice(3,"444","442","424","422")
#@gui : sep = separator()
#@gui : note = note("Fake Glitch")
#@gui : 3. Power = float(0,0,10)
#@gui : 4. Colour Distortion = float(1,0,2)
#@gui : 5. Max Glitch Length = int(5,2,10)
#@gui : 6. Max Value Errors Per Tile = int(5,0,10)
#@gui : 7. Error Strength = float(0,1,8)
#@gui : 8. Persistent Value Errors Power = float(0.25,0,1)
#@gui : 9. Error Bias = float(0.5,0,1)
#@gui : 10. Tile Shift Power = float(0.25,0,1)
#@gui : 11. Mirror = choice("None","X","Y","XY")
#@gui : 12. Rotate = choice("None,"90 clockwise","180","90 anticlockwise")
#@gui : sep = separator()
#@gui : note = note("Self-Bomb")
#@gui : 13. Enable = bool(0)
#@gui : 14. Mesh X = int(16,1,256)
#@gui : 15. Mesh Y = int(16,1,256)
#@gui : 16. Mesh smoothness = float(0.5,0,10)
#@gui : 17. Contrast scheme = choice(1,"Arctan","Clip","Power)
#@gui : 18. Mesh contrast = float(75,0,100)
#@gui : 19. Scale X = float(1,0.05,16)
#@gui : 20. Scale Y = float(1,0.05,16)
#@gui : 21. Interpolation = choice(0,"None","Nearest","Average","Bilinear","Grid","Bicubic")
#@gui : 22. Normalise = bool(0)
#@gui : 23. Output mesh = bool(0)
#@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: Joan Rake, \'borrowed\' from <i><a href="https://goo.gl/Ryf7Cv">David Tschumperl&#233;</a></i>.      Latest Update: <i>2017/05/07</i>.</small>")
fx_jfif :
cd={$4^2.5}
gl=$5
ve=$6
es=$7
ste=$8
bias={2^(6-($9*12))}
ts={$10^2}
base642img "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"
base642img "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"
nm[-2,-1] dct,idct
i[Q] (16,11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62;18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101;72,92,95,98,112,100,103,99)
f. "const S = $1<50?5000/$1:200-2*$1; max(1,round((S*i+50)/100,1,-1))"
repeat {$!-3} l[$>,-3--1]
gp={(0.25^((10-$3)*log(wh(#0))/30))*$3/10}
ww={w(#0)}
hh={h(#0)}
if {$11==1}
mirror[0] x
elif {$11==2}
mirror[0] y
elif {$11==3}
mirror[0] xy
fi
if $12
rotate[0] {$12*90},0
fi
if $13
www={w(#0)}
hhh={h(#0)}
r[0] {$www*$19},{$hhh*$20},100%,100%,$21
fi
i[G] {w(#0)},{h(#0)},1,1 f[$G] ">begin(chance = "$gp"; tlmax="$gl"; tt=-1; val=0; sticky="$ste");
if (!(x%16) && !(y%16),for (l = 0, l<2, ++l, for (k = 0, k<2, ++k, (u<=chance?((val=1);tt=round(u(1,tlmax))):tt>=0?(val=0;--tt):(u<=sticky?(val=-2):val=-1)); j(k*8,l*8)=val)),0)"
l[0] w,h={[w,h]} r {w+(-w%16)},{h+(-h%16)},1,100%,0,3 rgb2srgb gcd_srgb2jpeg s c
if {$2==1} r[-2,-1] 100%,50%,1,1,2 elif {$2==2} r[-2,-1] 50%,100%,1,1,2 elif {$2==3} r[-2,-1] 50%,50%,1,1,2 fi round. endl
bw,bh=8
repeat 3
if {$>==1}
if {$2==1} bh=16 elif {$2==2} bw=16 elif {$2==3} bh,bw=16 fi
fi
[$>]
f[$>] ">begin(boundary = 2; res = vector64(); gres = vector64(); const cbw="$bw"; const cbh="$bh"; const cbwh=cbw*cbh; glitch=0; const cold="$cd"; gval=1; const errval="$ve"; const bias = "$bias"; const strength="$es");
if (!(x%(128/cbw)) && !(y%(128/cbh)),for (ll = 0, ll<(16/cbw), ++ll, for (kk = 0, kk<(16/cbh), ++kk,
src = crop(x+(ll*8),y+(kk*8),8,8);
gpunch=crop(#"$G",cbw/8*(x+(ll*8)),cbh/8*(y+(ll*8)),cbw,cbh);
max(gpunch)==1?(glitch=1);
glitch==1?(gval=cut(gval+(u(-cold,cold)/15),0,1);errnum=u(1,errval);for (ve=0,ve<errnum,++ve,gres[int(floor((u^bias)*8)+floor((u^bias)*8)*8)]=round((u(-strength,strength)^5),0.1,1)));
for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = int(gres[off]+sum(gval*src*crop(#"$dct",0,0,off,8,8,1)))));
draw(#-1,res,x+(ll*8),y+(kk*8),0,0,8,8);
min(gpunch)<=-1?(glitch=0;errnum=0;tileerror=0;min(gpunch)==-1?gres=vector64(0))))); i"
round.
+r[$Q] {$>,w},100%,1,1,0,2 /.. . round.. *[-2,-1]
dispw={w(#1)}
f. ">begin(boundary = 2; res = vector64(); const cbw="$bw"; const cbh="$bh"; const cbwh=cbw*cbh; glitch=0; const cold="$cd"; gval=0; const dispwidth="$dispw";disp=0;shift="$ts");
if (!(x%(128/cbw)) && !(y%(128/cbh)),for (ll = 0, ll<(16/cbw), ++ll, for (kk = 0, kk<(16/cbh), ++kk,
src = crop((x+(ll*8+cbw*disp))%(dispwidth/cbw*16),y+(kk*8)+cbh*floor((x+cbw*disp)/(dispwidth/cbw*16)),8,8);
gpunch=crop(#"$G",cbw/8*(x+(ll*8)),cbh/8*(y+(ll*8)),cbw,cbh);
max(gpunch)==1?(glitch=1);
glitch==1?((u<=shift?++disp);gval=cut(gval+(u(-cold,cold)/5),-1,5));
for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = int(sum(gval+src*crop(#"$idct",0,0,off,8,8,1)))));
draw(#"$>",res,x+(ll*8),y+(kk*8),0,0,8,8);
min(gpunch)<=-1?(glitch=0;errnum=0;min(gpunch)==-1?gres=vector64(0))))); i"
rm.
l[$>] r {w*($bw/8)},{h*($bh/8)},1,1,1 endl
round[$>]
done
rm[$G]
l[^4--1] a c gcd_jpeg2srgb srgb2rgb round. r $w,$h,1,3,0
if $13 blend_bomb 1,${14-18},0,0,0,${22-23}
r $www,$hhh,100%,100%,$21 fi
if $12
rotate[0] {-$12*90},0
fi
if {$11==1}
mirror[0] x
elif {$11==2}
mirror[0] y
elif {$11==3}
mirror[0] xy
fi
endl
endl done
rm[$dct,$idct,$Q]
fx_jfif_preview :
fx_jfif $*
#gui_split_preview "fx_jfif $*",${-3--1}

As for what you’ve found, that’s a script that’ll take a while but will have a really nice result. I’d have to loop the classic ‘JPEG artefacts’ script over something that resizes an image.

1 Like

A little something extra.

1 Like

Could be a pattern on a rug or t-shirt. :smile:


radio noise con SSTV (slow scan TV)
https://www.sigidwiki.com/wiki/SSTV

@Joan_Rake1 This has been bugging me a while as my blending modes for Krita is finally accepted, and I had it before when developing blending modes. What do you think about a new filter idea called ‘Psychedelia Blending’ which utilize weird blending modes equations that doesn’t really fit for usual purposes at all. Used to radically alter the tone or colors of images.

For a preliminary filter, this filter should use at least 4 blending modes

Assuming 0,1 range

f.circle1(a,b) = (1-a)^2+a^2+(1-b)^2+b^2-1
f.circle2(a,b) = (a^2+b^2>.25^2)?1.5*f.circle1:0
f.psychedelic1(a,b)=.5-sin(pi*a/.5)*sin(pi*b/2)*.5

These are examples I found.

1 Like

I wanted to quote your equation but ended up with the quote above. Imho that could be improved.
Not your equation, but the quoting of math formulas on pixls.us.

Concerning your equation: Could you clarify by adding brackets?

For example -a² + a² + -b² + b² -1 can be -1 or 2*(a² + b²) -1

Edit: I just saw you modified your post. All good :slight_smile:

Had some fun: gmic sp tiger +mirror x circle1

Oops, if I normalize tiger to [0,1] prior to circle1, the result would be




gmic sp tiger +mirror x circle2




gmic sp tiger +mirror x psychedelic1

One small one-liner discovery today, that looks like glitch-art:

$ gmic sp lena b 50 +round - n 0,255

(It just keeps a kind of signed fractional part of the blurred pixel values).

lena_glitch

It gives also nice weird things when applied on a random image:

$ gmic 500,500,1,3 rand 0,255 b 20 +round - n 0,255

rand_glitch

Also, with a simple shape :

$ gmic shape_circle 200 n 0,255 frame 100,100,0 b 40 +round - n 0,255

circle_glitch

And in the same spirit, it’s interesting to reverse the byte order of a blurred + multiplied image:

$ gmic sp lena b 5 mul 16 endian ushort n 0,255

lena_glitch2

1 Like

I’ve added a new filter in the plug-in : Degradations / Mess With Bits

It basically allows to re-order bits of an input image to create glitch effects.

1 Like

@bazza That can be done using a row shifter script or the warp command and some scanlines generator. I wouldn’t use a row shifter now because there’s a problem with image borders which I can’t seem to fix using a script.

@Reptorian Those formulae are good ideas and they can be adapted to work as examples for the mesh blend script and the CSG script. The ‘psychedelic’ one looks like it could have more parameters than just the two input pixels for the sine wavelengths, and that reminds me of an old exploration of blending mode parameters in a thread whose whereabouts I can’t remember.

@David_Tschumperle Great discoveries, I’ll update the filter list accordingly and maybe see what I can do with them.

Okay, now that I’m finished with modulo operations cli commands, I updated my reptorian.gmic via github. I also notified @Joan_Rake1 to see what he can do using those. You can see my earlier edit to see the effect of the modulo operations cli commands.

Another experiment with the modulo operations cli


I like the texture here.
image
Trying to mimic this idea - How to "posterize"? - Paint.NET Discussion and Questions - paint.net Forum

David, is the above the code behind plug-in : Degradations / Mess With Bits ?

When I tested the code in custom code applied to some of the channels, I found a couples of interesting results.
In particular when applied to Lab [Lightness] , CMYK [Key] , HSL [Lightness].

Would it be feasible to add to “Mess with Bits” a selector of the channel ?

I think so, yes. Good idea, indeed :slight_smile:

2 Likes

Done. And I’ve also added an ‘Opacity’ parameter in ‘output settings’ to be able to make the effect more subtle if necessary.

1 Like

I finished my modulo CLI command. Now, it’s ready for filter writing, and a lot easier to write sawtoother, that’s for sure.

I have only changed joan_rake.gmic from my own branch in gmic for testing purpose, and the main change I wanted to show is that I have added triangle wave function into cascading self-glitching. If all goes well, I’ll have to do a pull request modifying Joan_Rake.gmic file as he’s not here anymore.

Here’s a sample with smooth modulo also known as triangle wave


I made my own command, and I think I might be able to make my own self-cascading glitch with the modulo modes.

Behold the result of this command!

Also, to filter developers, I have modified modo cli a bit. I’ll have to update it though I don’t think anyone is using those yet. modf is usable, but modo should not be used. modf can be used for anything related to gradient editing when last variable is at 0. Because of modo, and modf, I can attempt to make a universal sawtoother. Here’s the code so far

#@gui Advanced Sawtoother : fx_modulo, fx_modulo_preview(0)
#@gui : note = note("This filter utilize various forms of modulo operations at once per different channels or multiple channels at once."), sep = separator()
#@gui : 1. Color Space Model = choice(0,"RGB-8","CMY-8","HSI-8","HSL-8","HSV-8","LAB-8","LCH-8","YUV-8","XYZ-8")
#@gui : sep = separator(), note = note("<b>Master Channel Editor</b>")
#@gui : Use Master Editor? = bool(1)
#@gui : 1. Edit Channel #1? = bool(1)
#@gui : 2. Edit Channel #2? = bool(1)
#@gui : 3. Edit Channel #3? = bool(1)
#@gui : 4. Edit Alpha Channel? = bool(0)
#@gui : 5. Treat Alpha Layers as the blend of each other instead? = bool(1)
#@gui : 6. Modulo Shift = float(0,-2,2)
#@gui : 7. Max End Value of Modulo Shift = float(255,0,512)
#@gui : 8. Modulo Shift Mode = choice(0,"Regular","Continuous")
#@gui : 9. Treat Modulo Shift as interchanging blending? = bool(0)
#@gui : 10. Modulo Division = float(1,0,1)
#@gui : 11. Max End Value of Modulo Division = float(255,0,512)
#@gui : 12. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 13. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 14. Regular Modulo = float(1,0,1)
#@gui : 15. Max End Value of Modulo Division = float(255,0,512)
#@gui : 16. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 17. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 18. Smoothness = float(0,0,32)
#@gui : sep = separator(), note = note("<b>Individual Channel Editor</b>\n\n")
#@gui : sep = separator(),19. Edit Channel #1 = bool(1)
#@gui : 20. Modulo Shift = float(0,-2,2)
#@gui : 21. Max End Value of Modulo Shift = float(255,0,512)
#@gui : 22. Modulo Shift Mode = choice(0,"Regular","Continuous")
#@gui : 23. Treat Modulo Shift as interchanging blending? = bool(0)
#@gui : 24. Modulo Division = float(1,0,1)
#@gui : 25. Max End Value of Modulo Division = float(255,0,512)
#@gui : 26. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 27. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 28. Regular Modulo = float(1,0,1)
#@gui : 29. Max End Value of Modulo Division = float(255,0,512)
#@gui : 30. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 31. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 32. Smoothness = float(0,0,32)
#@gui : sep = separator(), 33. Edit Channel #2 = bool(1)
#@gui : 34. Modulo Shift = float(0,-2,2)
#@gui : 35. Max End Value of Modulo Shift = float(255,0,512)
#@gui : 36. Modulo Shift Mode = choice(0,"Regular","Continuous")
#@gui : 37. Treat Modulo Shift as interchanging blending? = bool(0)
#@gui : 38. Modulo Division = float(1,0,1)
#@gui : 39. Max End Value of Modulo Division = float(255,0,512)
#@gui : 40. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 41. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 42. Regular Modulo = float(1,0,1)
#@gui : 43. Max End Value of Modulo Division = float(255,0,512)
#@gui : 44. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 45. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 46. Smoothness = float(0,0,32)
#@gui : sep = separator(), 47. Edit Channel #3 = bool(1)
#@gui : 48. Modulo Shift = float(0,-2,2)
#@gui : 49. Max End Value of Modulo Shift = float(255,0,512)
#@gui : 50. Modulo Shift Mode = choice(0,"Regular","Continuous")
#@gui : 51. Treat Modulo Shift as interchanging blending? = bool(0)
#@gui : 52. Modulo Division = float(1,0,1)
#@gui : 53. Max End Value of Modulo Division = float(255,0,512)
#@gui : 54. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 55. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 56. Regular Modulo = float(1,0,1)
#@gui : 57. Max End Value of Modulo Division = float(255,0,512)
#@gui : 58. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 59. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 60. Smoothness = float(0,0,32)
#@gui : sep = separator(), 61. Edit Alpha Layers? = bool(1)
#@gui : 62. Treat alpha as blending modes ignoring modulo operation? = bool(1)
#@gui : 63. Modulo Shift = float(0,-2,2)
#@gui : 64. Max End Value of Modulo Shift = float(255,0,512)
#@gui : 65. Modulo Shift Mode = choice(0,"Regular","Continuous")
#@gui : 66. Treat Modulo Shift as interchanging blending? = bool(0)
#@gui : 67. Modulo Division = float(1,0,1)
#@gui : 68. Max End Value of Modulo Division = float(255,0,512)
#@gui : 69. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 70. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : 71. Regular Modulo = float(1,0,1)
#@gui : 72. Max End Value of Modulo Division = float(255,0,512)
#@gui : 73. Modulo Division Mode = choice(0,"Regular","Continuous")
#@gui : 74. Treat Modulo Division as interchanging blending? = bool(0)
#@gui : sep = separator(), note = note("<small>Author : <i>Reptorian</i>.      Latest update : <i>2018/08/18</i>.</small>")
fx_modulo:
_fx_modulo:

fx_modulo_preview :

Got some more updates - Now, a PNG filter is on it way to being born

iw=w
ih=h

repeat 4 1,{$ih},1,1 done l[1] noise 100 +noise 100 n 0,255 blend multiply n 0,1 f "round(i^2)" n 0,255 endl l[3] noise 1000 blur 10 n 0,125 endl l[4] to_rgb noise 10000 (255,0,0,0,255,255^0,255,0,255,0,255^0,0,255,255,255,0) index[0] [1],0,1 rm[1] endl

r[1-4] {w#5},{h#5},1,3,1

f[2] "x" n[2] 0,255 f[2] "i>i#3?0:255" rm[3] blend[1,2] multiply luminance[1] a[1,2] c blend difference
2 Likes