-
Notifications
You must be signed in to change notification settings - Fork 0
/
effects.go
89 lines (85 loc) · 2.93 KB
/
effects.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package composer
import (
"github.com/anthonynsimon/bild/adjust"
"github.com/anthonynsimon/bild/blur"
"github.com/anthonynsimon/bild/effect"
"github.com/anthonynsimon/bild/paint"
"github.com/anthonynsimon/bild/transform"
"github.com/getevo/evo/lib"
"image"
"image/color"
"regexp"
"strings"
)
var effectRegex = regexp.MustCompile(`(?m)(\w+)\((.*?)\)`)
func ApplyEffect(apply string, im image.Image) image.Image {
var effects = effectRegex.FindAllStringSubmatch(apply,-1)
for _,item := range effects{
var params = strings.Split(item[2],",")
switch strings.ToLower(item[1]) {
case "brightness":
im = adjust.Brightness(im,lib.ParseSafeFloat(params[0]))
case "contrast":
im = adjust.Contrast(im,lib.ParseSafeFloat(params[0]))
case "gamma":
im = adjust.Gamma(im,lib.ParseSafeFloat(params[0]))
case "hue":
im = adjust.Hue(im,lib.ParseSafeInt(params[0]))
case "saturation":
im = adjust.Saturation(im,lib.ParseSafeFloat(params[0]))
case "dilate":
im = effect.Dilate(im,lib.ParseSafeFloat(params[0]))
case "blur.box":
im = blur.Box(im,lib.ParseSafeFloat(params[0]))
case "blur.gaussian":
im = blur.Gaussian(im,lib.ParseSafeFloat(params[0]))
case "edge":
im = effect.EdgeDetection(im,lib.ParseSafeFloat(params[0]))
case "emboss":
im = effect.Emboss(im)
case "erode":
im = effect.Erode(im,lib.ParseSafeFloat(params[0]))
case "grayscale":
im = effect.Grayscale(im)
case "median":
im = effect.Median(im,lib.ParseSafeFloat(params[0]))
case "sepia":
im = effect.Sepia(im)
case "sharpen":
im = effect.Sharpen(im)
case "sobel":
im = effect.Sobel(im)
case "unsharpmask":
if len(params) == 2 {
im = effect.UnsharpMask(im, lib.ParseSafeFloat(params[0]), lib.ParseSafeFloat(params[1]))
}
case "crop":
if len(params) == 4 {
im = transform.Crop(im, image.Rect(lib.ParseSafeInt(params[0]), lib.ParseSafeInt(params[1]), lib.ParseSafeInt(params[2]), lib.ParseSafeInt(params[3])))
}
case "invert":
im = effect.Invert(im)
case "flipv":
im = transform.FlipV(im)
case "fliph":
im = transform.FlipH(im)
case "removebackground":
im = RemoveBackground(im,lib.ParseSafeInt(params[0]))
case "floodfill":
if len(params) == 4 {
c, err := ParseColor(params[2])
if err != nil {
im = paint.FloodFill(im, image.Point{lib.ParseSafeInt(params[0]), lib.ParseSafeInt(params[1])}, c, uint8(lib.ParseSafeInt(params[3])))
}
}
}
}
return im
}
func RemoveBackground(img image.Image,sensitivity int) image.Image{
result := paint.FloodFill(img, image.Point{0, 0}, color.RGBA{0, 0, 0, 0}, uint8(sensitivity))
result = paint.FloodFill(result, image.Point{img.Bounds().Max.X, 0}, color.RGBA{0, 0, 0, 0}, uint8(sensitivity))
result = paint.FloodFill(result, image.Point{0, img.Bounds().Max.Y}, color.RGBA{0, 0, 0, 0}, uint8(sensitivity))
result = paint.FloodFill(result, image.Point{img.Bounds().Max.X, img.Bounds().Max.Y}, color.RGBA{0, 0, 0, 0}, uint8(sensitivity))
return result
}