Kaynağa Gözat

Move to image transform plugins + web server

Gildas Chabot 8 yıl önce
ebeveyn
işleme
6677a9a322

BIN
lca.jpg


+ 26 - 10
main.go

@@ -1,25 +1,28 @@
1 1
 package main
2 2
 
3 3
 import (
4
+	"image"
5
+	"image/jpeg"
4 6
 	"log"
7
+	"net/http"
5 8
 	"os"
6 9
 	"path"
7 10
 	"plugin"
8 11
 )
9 12
 
10
-func loadPlugin(path string) (func(string), error) {
13
+func loadPlugin(path string) (func(image.Image) image.Image, error) {
11 14
 	p, err := plugin.Open(path)
12 15
 	if err != nil {
13 16
 		return nil, err
14 17
 	}
15
-	sayHello, err := p.Lookup("SayHello")
18
+	transform, err := p.Lookup("Transform")
16 19
 	if err != nil {
17 20
 		return nil, err
18 21
 	}
19
-	return sayHello.(func(string)), nil
22
+	return transform.(func(image.Image) image.Image), nil
20 23
 }
21 24
 
22
-func getPlugins(pluginDir string) ([]func(string), error) {
25
+func getPlugins(pluginDir string) ([]func(image.Image) image.Image, error) {
23 26
 	pDir, err := os.Open(pluginDir)
24 27
 	if err != nil {
25 28
 		return nil, err
@@ -29,7 +32,7 @@ func getPlugins(pluginDir string) ([]func(string), error) {
29 32
 		return nil, err
30 33
 	}
31 34
 
32
-	var ret []func(string)
35
+	var ret []func(image.Image) image.Image
33 36
 	for _, pFile := range pFiles {
34 37
 		if pFile.IsDir() {
35 38
 			continue
@@ -45,14 +48,27 @@ func getPlugins(pluginDir string) ([]func(string), error) {
45 48
 	return ret, nil
46 49
 }
47 50
 
48
-func main() {
49
-	pluginDir := os.Args[1]
51
+func handler(w http.ResponseWriter, r *http.Request) {
52
+	fi, _ := os.Open("lca.jpg")
53
+	i, _ := jpeg.Decode(fi)
50 54
 
51
-	ps, err := getPlugins(pluginDir)
55
+	plugins, err := getPlugins(pluginDir)
52 56
 	if err != nil {
53 57
 		panic(err)
54 58
 	}
55
-	for _, p := range ps {
56
-		p("Gildas")
59
+
60
+	for _, p := range plugins {
61
+		i = p(i)
57 62
 	}
63
+
64
+	jpeg.Encode(w, i, nil)
65
+}
66
+
67
+var pluginDir string
68
+
69
+func main() {
70
+	pluginDir = os.Args[1]
71
+
72
+	http.HandleFunc("/a.jpg", handler)
73
+	http.ListenAndServe(":8080", nil)
58 74
 }

+ 16 - 0
pluginSrc/grayscale/plugin.go

@@ -0,0 +1,16 @@
1
+package main
2
+
3
+import "image"
4
+
5
+// Convert to grayscale image
6
+func Transform(src image.Image) image.Image {
7
+	bounds := src.Bounds()
8
+	w, h := bounds.Max.X, bounds.Max.Y
9
+	ret := image.NewGray(image.Rectangle{image.Point{0, 0}, image.Point{w, h}})
10
+	for x := 0; x < w; x++ {
11
+		for y := 0; y < h; y++ {
12
+			ret.Set(x, y, src.At(x, y))
13
+		}
14
+	}
15
+	return ret
16
+}

+ 0 - 11
pluginSrc/plugin/plugin.go

@@ -1,11 +0,0 @@
1
-package main
2
-
3
-import "fmt"
4
-
5
-func SayHello(name string) {
6
-	fmt.Println("HELLO", name)
7
-}
8
-
9
-func main() {
10
-	fmt.Println("Coucou")
11
-}

+ 0 - 11
pluginSrc/plugin2/plugin2.go

@@ -1,11 +0,0 @@
1
-package main
2
-
3
-import "fmt"
4
-
5
-func SayHello(name string) {
6
-	fmt.Println("Bonjour, je m'appelle", name)
7
-}
8
-
9
-func main() {
10
-	fmt.Println("Coucou")
11
-}

+ 36 - 0
pluginSrc/posterize/plugin.go

@@ -0,0 +1,36 @@
1
+package main
2
+
3
+import (
4
+	"image"
5
+	"image/color"
6
+)
7
+
8
+// Convert to binary image
9
+func Transform(src image.Image) image.Image {
10
+	bounds := src.Bounds()
11
+	w, h := bounds.Max.X, bounds.Max.Y
12
+	ret := image.NewRGBA(image.Rectangle{image.Point{0, 0}, image.Point{w, h}})
13
+	for x := 0; x < w; x++ {
14
+		for y := 0; y < h; y++ {
15
+			r, g, b, _ := src.At(x, y).RGBA()
16
+			r, g, b = r/256, g/256, b/256
17
+			if r < 100 {
18
+				r = 0
19
+			} else {
20
+				r = 255
21
+			}
22
+			if g < 100 {
23
+				g = 0
24
+			} else {
25
+				g = 255
26
+			}
27
+			if b < 100 {
28
+				b = 0
29
+			} else {
30
+				b = 255
31
+			}
32
+			ret.Set(x, y, color.RGBA{uint8(r), uint8(g), uint8(b), 0})
33
+		}
34
+	}
35
+	return ret
36
+}