forked from alco/go_pil
/
to_grayscale.go
106 lines (90 loc) · 2.29 KB
/
to_grayscale.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"fmt"
"image"
"image/png"
"image/draw"
"log"
"os"
"time"
)
var bench_total float64
func benchmark(comment string, fun func() interface{}) interface{} {
t := time.Now()
result := fun()
delta_ms := float64(time.Now().Sub(t).Nanoseconds()) / 1000 / 1000
bench_total += delta_ms
fmt.Printf("%s took %g ms\n", comment, delta_ms)
return result
}
func printSummary() {
fmt.Println("---")
fmt.Printf("Total time: %g ms\n", bench_total)
}
func openImage(path string) image.Image {
// Open the file.
file, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Decode the image.
return benchmark("Image decode", func() (img interface{}) {
img, err := png.Decode(file)
if err != nil {
log.Fatal(err)
}
return
}).(image.Image)
}
func saveImage(image image.Image, path string) {
// Create or truncate the file.
out_file, err := os.Create(path)
if err != nil {
log.Fatal(err)
}
defer out_file.Close()
// Save the image
benchmark("Image save", func() (_ interface{}) {
err = png.Encode(out_file, image)
if err != nil {
log.Fatal(err)
}
return
})
}
func newGray(bounds image.Rectangle) *image.Gray {
return benchmark("Creating an empty image", func() interface{} {
return image.NewGray(bounds)
}).(*image.Gray)
}
func convertDraw(img image.Image, dst *image.Gray) {
benchmark("Drawing the image", func() interface{} {
draw.Draw(dst, dst.Bounds(), img, image.ZP, draw.Src)
return nil
})
}
func convertLoop(img image.Image, dst *image.Gray) {
benchmark("Converting pixels", func() interface{} {
rgba := img.(*image.NRGBA)
for i := 0; i < len(dst.Pix); i++ {
dst.Pix[i] = rgba.Pix[i*4 + 3]
}
return nil
})
}
func main() {
for i := 0; i < 2; i++ {
bench_total = 0
image := openImage("image.png")
grayscale := newGray(image.Bounds())
if i == 0 {
convertDraw(image, grayscale)
} else {
convertLoop(image, grayscale)
}
saveImage(grayscale, "go_output.png")
printSummary()
fmt.Println()
}
}