Skip to content

Commit de46855

Browse files
committed
kadai2-hisamura
1 parent 1b40d34 commit de46855

File tree

9 files changed

+240
-0
lines changed

9 files changed

+240
-0
lines changed

kadai2/convert/convert.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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) (string, error) {
37+
38+
files := dirwalk(flagOps.Dir)
39+
var convertedName string
40+
41+
for _, file := range files {
42+
fileDetails := FileDetails{
43+
filepath.Ext(file),
44+
filepath.Clean(file),
45+
}
46+
47+
if strings.HasSuffix(fileDetails.Extension, flagOps.Src) {
48+
49+
decodeImg, err := decodeImage(fileDetails)
50+
if err != nil {
51+
return "", err
52+
}
53+
54+
if flagOps.Remove {
55+
defer os.Remove(fileDetails.FileName)
56+
}
57+
58+
fileNameRemoveExt := strings.Replace(fileDetails.FileName, flagOps.Src, "", 1)
59+
dstFile, err := os.Create(fmt.Sprintf(fileNameRemoveExt + flagOps.Dest))
60+
if err != nil {
61+
return "", err
62+
}
63+
convertedName = dstFile.Name()
64+
defer dstFile.Close()
65+
66+
err = encodeImage(decodeImg, flagOps, dstFile)
67+
if err != nil {
68+
return "", err
69+
}
70+
}
71+
}
72+
return convertedName, nil
73+
74+
}
75+
76+
func decodeImage(fileDetails FileDetails) (image.Image, error) {
77+
srcFile, err := os.Open(fileDetails.FileName)
78+
79+
defer srcFile.Close()
80+
81+
if err != nil {
82+
return nil, err
83+
}
84+
85+
decodeImg, _, err := image.Decode(srcFile)
86+
return decodeImg, err
87+
}
88+
89+
func encodeImage(decodeImg image.Image, flagOps FlagOps, dstFile *os.File) error {
90+
switch flagOps.Dest {
91+
case "jpeg", "jpg":
92+
err := jpeg.Encode(dstFile, decodeImg, nil)
93+
return err
94+
95+
case "gif":
96+
err := gif.Encode(dstFile, decodeImg, nil)
97+
return err
98+
99+
case "png":
100+
err := png.Encode(dstFile, decodeImg)
101+
return err
102+
103+
default:
104+
return fmt.Errorf("Error: invalid extension")
105+
}
106+
}
107+
108+
//指定したディレクトリ配下のファイルを取得
109+
func dirwalk(dir string) []string {
110+
files, err := ioutil.ReadDir(dir)
111+
if err != nil {
112+
panic(err)
113+
}
114+
115+
var paths []string
116+
for _, file := range files {
117+
if file.IsDir() {
118+
paths = append(paths, dirwalk(filepath.Join(dir, file.Name()))...)
119+
continue
120+
}
121+
paths = append(paths, filepath.Join(dir, file.Name()))
122+
}
123+
124+
return paths
125+
}

kadai2/convert/convert_test.go

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package convert
2+
3+
import (
4+
"testing"
5+
)
6+
7+
type testImage struct {
8+
name string
9+
src string
10+
dest string
11+
expected string
12+
}
13+
14+
func TestSuccess(t *testing.T) {
15+
16+
cases := []testImage{
17+
testImage{"jpgToGif", "jpg", "gif", "../testdata/test.gif"},
18+
testImage{"jpgToGif", "jpg", "gif", "../testdata/test.gif"},
19+
testImage{"jpgToPng", "jpg", "png", "../testdata/test.png"},
20+
testImage{"gifToJpg", "gif", "jpg", "../testdata/test.jpg"},
21+
testImage{"gifToPng", "gif", "png", "../testdata/test.png"},
22+
testImage{"pngToGif", "png", "gif", "../testdata/test.gif"},
23+
testImage{"pngToJpg", "gif", "png", "../testdata/test.png"},
24+
}
25+
26+
for _, c := range cases {
27+
t.Run(c.name, func(t *testing.T) {
28+
testSuccessConvert(t, c)
29+
})
30+
}
31+
}
32+
33+
func testSuccessConvert(t *testing.T, c testImage) {
34+
t.Helper()
35+
myflag := FlagOps{"../testdata", c.src, c.dest, false}
36+
convertedNmae, err := Convert(myflag)
37+
38+
if convertedNmae != c.expected {
39+
t.Fatal("differnt name")
40+
}
41+
if err != nil {
42+
t.Fatal(err)
43+
}
44+
}
45+
46+
func TestFail(t *testing.T) {
47+
cases := []testImage{
48+
testImage{"jpgToGif", "jpg", "img", "../testdata/test.img"},
49+
}
50+
51+
for _, c := range cases {
52+
t.Run(c.name, func(t *testing.T) {
53+
testFailConvert(t, c)
54+
})
55+
}
56+
57+
}
58+
59+
func testFailConvert(t *testing.T, c testImage) {
60+
t.Helper()
61+
myflag := FlagOps{"../testdata", c.src, c.dest, false}
62+
convertedNmae, err := Convert(myflag)
63+
64+
if convertedNmae != "" {
65+
t.Fatal("not empty name")
66+
}
67+
if err == nil {
68+
t.Fatal("err nil")
69+
}
70+
}

kadai2/go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module dojo6/kadai2

kadai2/kadai2

2.71 MB
Binary file not shown.

kadai2/main.go

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

kadai2/testdata/test.gif

107 KB
Loading

kadai2/testdata/test.img

Whitespace-only changes.

kadai2/testdata/test.jpg

70.1 KB
Loading

kadai2/testdata/test.png

101 KB
Loading

0 commit comments

Comments
 (0)