Browse Source

Move to image transform plugins + web server

Gildas Chabot 8 years ago
parent
commit
6677a9a322
6 changed files with 78 additions and 32 deletions
  1. BIN
      lca.jpg
  2. 26 10
      main.go
  3. 16 0
      pluginSrc/grayscale/plugin.go
  4. 0 11
      pluginSrc/plugin/plugin.go
  5. 0 11
      pluginSrc/plugin2/plugin2.go
  6. 36 0
      pluginSrc/posterize/plugin.go

BIN
lca.jpg


+ 26 - 10
main.go

@@ -1,25 +1,28 @@
1
 package main
1
 package main
2
 
2
 
3
 import (
3
 import (
4
+	"image"
5
+	"image/jpeg"
4
 	"log"
6
 	"log"
7
+	"net/http"
5
 	"os"
8
 	"os"
6
 	"path"
9
 	"path"
7
 	"plugin"
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
 	p, err := plugin.Open(path)
14
 	p, err := plugin.Open(path)
12
 	if err != nil {
15
 	if err != nil {
13
 		return nil, err
16
 		return nil, err
14
 	}
17
 	}
15
-	sayHello, err := p.Lookup("SayHello")
18
+	transform, err := p.Lookup("Transform")
16
 	if err != nil {
19
 	if err != nil {
17
 		return nil, err
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
 	pDir, err := os.Open(pluginDir)
26
 	pDir, err := os.Open(pluginDir)
24
 	if err != nil {
27
 	if err != nil {
25
 		return nil, err
28
 		return nil, err
@@ -29,7 +32,7 @@ func getPlugins(pluginDir string) ([]func(string), error) {
29
 		return nil, err
32
 		return nil, err
30
 	}
33
 	}
31
 
34
 
32
-	var ret []func(string)
35
+	var ret []func(image.Image) image.Image
33
 	for _, pFile := range pFiles {
36
 	for _, pFile := range pFiles {
34
 		if pFile.IsDir() {
37
 		if pFile.IsDir() {
35
 			continue
38
 			continue
@@ -45,14 +48,27 @@ func getPlugins(pluginDir string) ([]func(string), error) {
45
 	return ret, nil
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
 	if err != nil {
56
 	if err != nil {
53
 		panic(err)
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
+}