Skip to content

Commit 77763b5

Browse files
committed
kadai1-hisamura
1 parent 1b40d34 commit 77763b5

File tree

4 files changed

+198
-0
lines changed

4 files changed

+198
-0
lines changed

kadai1/convert/convert.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Package convert is image conversion processing
2+
//
3+
// 画像変換処理。
4+
// 変換前と変換後の拡張子を指定し、画像変換を行います。
5+
// ディレクトリを選択し、再帰的にディレクトリ探索を行い変換します。
6+
// 変換前のファイルを削除したい場合は、remove(-r)フラグを指定します。
7+
package convert
8+
9+
import (
10+
"fmt"
11+
"image"
12+
"image/gif"
13+
"image/jpeg"
14+
"image/png"
15+
"io/ioutil"
16+
"os"
17+
"path/filepath"
18+
"strings"
19+
)
20+
21+
// FlagOps is flag option
22+
type FlagOps struct {
23+
Dir string
24+
Src string
25+
Dest string
26+
Remove bool
27+
}
28+
29+
// FileDetails have Extionsion and FileName info
30+
type FileDetails struct {
31+
Extension string
32+
FileName string
33+
}
34+
35+
// Convert is image conversion processing
36+
func Convert(flagOps FlagOps) error {
37+
38+
files := dirwalk(flagOps.Dir)
39+
40+
for _, file := range files {
41+
fileDetails := FileDetails {
42+
filepath.Ext(file),
43+
filepath.Clean(file),
44+
}
45+
46+
if strings.HasSuffix(fileDetails.Extension, flagOps.Src) {
47+
48+
decodeImg, err := decodeImage(fileDetails)
49+
if err != nil {
50+
return err
51+
}
52+
53+
if flagOps.Remove {
54+
defer os.Remove(fileDetails.FileName)
55+
}
56+
57+
fileNameRemoveExt := strings.Replace(fileDetails.FileName, flagOps.Src, "", 1)
58+
dstFile, err := os.Create(fmt.Sprintf(fileNameRemoveExt + flagOps.Dest))
59+
if err != nil {
60+
return err
61+
}
62+
defer dstFile.Close()
63+
64+
err = encodeImage(decodeImg, flagOps, dstFile)
65+
if err != nil {
66+
return err
67+
}
68+
}
69+
}
70+
return nil
71+
72+
}
73+
74+
func decodeImage(fileDetails FileDetails) (image.Image, error) {
75+
srcFile, err := os.Open(fileDetails.FileName)
76+
77+
defer srcFile.Close()
78+
79+
if err != nil {
80+
return nil, err
81+
}
82+
83+
decodeImg, _, err := image.Decode(srcFile)
84+
return decodeImg, err
85+
}
86+
87+
func encodeImage(decodeImg image.Image, flagOps FlagOps, dstFile *os.File) error {
88+
switch flagOps.Dest {
89+
case "jpeg", "jpg":
90+
err := jpeg.Encode(dstFile, decodeImg, nil)
91+
return err
92+
93+
case "gif":
94+
err := gif.Encode(dstFile, decodeImg, nil)
95+
return err
96+
97+
case "png":
98+
err := png.Encode(dstFile, decodeImg)
99+
return err
100+
101+
default:
102+
return fmt.Errorf("Error: invalid extension")
103+
}
104+
}
105+
106+
//指定したディレクトリ配下のファイルを取得
107+
func dirwalk(dir string) []string {
108+
files, err := ioutil.ReadDir(dir)
109+
if err != nil {
110+
panic(err)
111+
}
112+
113+
var paths []string
114+
for _, file := range files {
115+
if file.IsDir() {
116+
paths = append(paths, dirwalk(filepath.Join(dir, file.Name()))...)
117+
continue
118+
}
119+
paths = append(paths, filepath.Join(dir, file.Name()))
120+
}
121+
122+
return paths
123+
}

kadai1/convert/convert_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package convert
2+
3+
import (
4+
"os"
5+
"testing"
6+
)
7+
8+
9+
// kadai1/test_images/test.pngファイルが存在しています。
10+
func TestSuccess(t *testing.T) {
11+
myflag := FlagOps{"../test_images", "png", "jpg", false}
12+
13+
err := Convert(myflag)
14+
defer os.Remove("../test_images/test.jpg")
15+
16+
if err != nil {
17+
t.Fatal("failed test")
18+
}
19+
20+
if _, err := os.Stat("../test_images/test.jpg"); os.IsNotExist(err) {
21+
t.Fatal("failed test")
22+
}
23+
}
24+
25+
func TestFail(t *testing.T) {
26+
myflag := FlagOps{"../test_images", "png", "img", false}
27+
28+
err := Convert(myflag)
29+
defer os.Remove("../test_images/test.img")
30+
31+
if err == nil {
32+
t.Fatal("failed test")
33+
}
34+
}

kadai1/main.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"dojo6/kadai1/convert"
7+
)
8+
9+
10+
func main() {
11+
12+
var (
13+
dir = flag.String("dir", "./", "変換したいディレクトリ配下")
14+
src = flag.String("s", "png", "変換前の拡張子")
15+
dest = flag.String("d", "jpg", "変換後の拡張子")
16+
remove = flag.Bool("r", false, "変換前の拡張子ファイルを削除するかのflag")
17+
)
18+
19+
flag.Parse()
20+
21+
flagOps := convert.FlagOps{Dir: *dir, Src: *src, Dest: *dest, Remove: *remove}
22+
23+
result := validation(flagOps)
24+
if result {
25+
fmt.Print("invalid extension")
26+
return
27+
}
28+
29+
err := convert.Convert(flagOps)
30+
if err != nil {
31+
fmt.Println(err)
32+
}
33+
}
34+
35+
func validation(flagOps convert.FlagOps) bool {
36+
if flagOps.Dest != "png" && flagOps.Dest != "jpg" && flagOps.Dest != "jpeg" && flagOps.Dest != "gif" {
37+
return true
38+
}
39+
return false
40+
}
41+

kadai1/test_images/test.png

592 KB
Loading

0 commit comments

Comments
 (0)