-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
127 lines (111 loc) · 2.73 KB
/
main.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"flag"
"fmt"
"image"
"image/gif"
"image/jpeg"
"image/png"
"os"
"path/filepath"
"golang.org/x/image/bmp"
diffimage "github.com/murooka/go-diff-image"
)
const (
exitOk = iota
exitInvalidArg
exitInvalidImage
exitFailedOperation
)
var (
out string
help bool
ver bool
)
func init() {
flag.StringVar(&out, "o", "diff.png", "output filename")
flag.BoolVar(&help, "h", false, "display help")
flag.BoolVar(&ver, "v", false, "display version")
flag.Parse()
}
func main() {
os.Exit(run())
}
func run() int {
if help {
fmt.Fprintf(os.Stdout, "Usage: imgdiff [<option>...] <old image> <new image>\n")
flag.PrintDefaults()
return exitOk
}
if ver {
fmt.Fprintf(os.Stdout, "imgdiff version %s.%s\n", Version, Revision)
return exitOk
}
args := flag.Args()
if len(args) != 2 {
fmt.Fprintf(os.Stderr, "Please set args.\n Usage: imgdiff [<option>...] <old image> <new image>\n")
flag.PrintDefaults()
return exitInvalidArg
}
fOld, err := os.Open(args[0])
if err != nil {
fmt.Fprintf(os.Stderr, "failed to open the old image: %v\n", err)
return exitInvalidArg
}
defer fOld.Close()
fNew, err := os.Open(args[1])
if err != nil {
fmt.Fprintf(os.Stderr, "failed to open the new image: %v\n", err)
return exitInvalidArg
}
defer fNew.Close()
// TODO: Decoding process based on extensions
imgOld, formatOld, err := image.Decode(fOld)
if err != nil {
fmt.Fprintf(os.Stderr, "first arg's image is invalid: %v\n", err)
return exitInvalidImage
}
imgNew, formatNew, err := image.Decode(fNew)
if err != nil {
fmt.Fprintf(os.Stderr, "second arg's image is invalid: %v\n", err)
return exitInvalidImage
}
if formatOld != formatNew {
fmt.Fprintf(os.Stderr, "image format does not match (first:%s, second:%s)\n", formatOld, formatNew)
return exitInvalidImage
}
dst := diffimage.DiffImage(imgOld, imgNew)
dir := filepath.Dir(out)
if _, err := os.Stat(dir); os.IsNotExist(err) {
err = os.MkdirAll(dir, 0777)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to create directory to save diff file: %v\n", err)
return exitInvalidArg
}
}
fDiff, err := os.OpenFile(out, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
fmt.Fprintf(os.Stderr, "output image's path is invalid:%v\n", err)
return exitInvalidArg
}
defer fDiff.Close()
var e error
switch formatNew {
case "png":
e = png.Encode(fDiff, dst)
case "jpeg":
e = jpeg.Encode(fDiff, dst, nil)
case "gif":
e = gif.Encode(fDiff, dst, nil)
case "bmp":
e = bmp.Encode(fDiff, dst)
default:
fmt.Fprintf(os.Stderr, "you passed unsupprted image format: %v\n", formatNew)
e = png.Encode(fDiff, dst)
}
if e != nil {
fmt.Fprintf(os.Stderr, "failed to save the output image: %v\n", err)
return exitFailedOperation
}
return exitOk
}