A go package to glitch an image based on an expression you pass in as input! The only limit is your creativity (and patience)!
You can think of the image as a functor that you map an expression to, for each pixel's component colors, returning a new one. The allowed operators are:
+
plus-
minus*
multiplication/
division%
modulo#
power of operator&
bit and|
bit or:
bit and not^
bit xor<
bit left shift>
bit right shift?
returns 255 if left side is greater otherwise 0@
attributes a weight in the range[0, 255]
to the value on the left
The expressions are made up of operators, numbers, parenthesis, and a set of parameters:
c
the current value of each pixel component colorb
the blurred version ofc
h
the horizontally flipped version ofc
v
the vertically flipped version ofc
d
the diagonally flipped version ofc
Y
the luminosity, or grayscale component of each pixelN
a noise pixel (i.e. a pixel where each component is a random value)R
the red color (i.e. rgb(255, 0, 0))G
the green color (i.e. rgb(0, 255, 0))B
the blue color (i.e. rgb(0, 0, 255))s
the value of each pixel's last saved evaluated expressionr
a pixel made up of a random color component from the neighboring 8 pixelse
the difference of all pixels in a box, creating an edge-like effectx
the current x coordinate being evaluated normalized in the range[0, 255]
y
the current y coordinate being evaluated normalized in the range[0, 255]
H
the highest valued color component in the neighboring 8 pixelsL
the lowest valued color component in the neighboring 8 pixels
128 & (c - ((c - 150 + s) > 5 < s))
(c & (c ^ 55)) + 25
128 & (c + 255) : (s ^ (c ^ 255)) + 25
More examples can be found here.
Use the docker image:
$ docker run sugoiuguu/go-glitch
package main
import (
"os"
"time"
"math/rand"
"image"
"image/png"
_ "image/jpeg"
"github.com/sugoiuguu/go-glitch"
)
func main() {
f, err := os.Open(os.Args[2])
if err != nil {
panic(err)
}
defer f.Close()
f2, err := os.Create(os.Args[1])
if err != nil {
panic(err)
}
defer f2.Close()
img, _, err := image.Decode(f)
if err != nil {
panic(err)
}
rand.Seed(time.Now().UnixNano())
expr, err := glitch.CompileExpression("(n|(c > 1)) ^ 128")
if err != nil {
panic(err)
}
g, err := expr.JumblePixels(img)
if err != nil {
panic(err)
}
png.Encode(f2, g)
}
There is an experimental interface for C/C++ code here. The API is:
typedef struct {
char *data;
size_t size;
} Image_t;
extern Image_t *jumble_pixels(char *expression, char *data, int size);