diff --git a/kadai1/ryokky59/README.md b/kadai1/ryokky59/README.md new file mode 100644 index 0000000..a0d569a --- /dev/null +++ b/kadai1/ryokky59/README.md @@ -0,0 +1,38 @@ +# 課題1 画像変換コマンドを作ろう + +## 課題内容 +次の仕様を満たすコマンドを作って下さい + +* [x] ディレクトリを指定する +* [x] 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) +* [x] ディレクトリ以下は再帰的に処理する +* [x] 変換前と変換後の画像形式を指定できる(オプション) + +以下を満たすように開発してください +* [x] mainパッケージと分離する +* [x] 自作パッケージと標準パッケージと準標準パッケージのみ使う + * 準標準パッケージ:golang.org/x以下のパッケージ +* [x] ユーザ定義型を作ってみる +* [x] GoDocを生成してみる +* [x] Go Modulesを使ってみる + +# 動作例 + +``` +$ go build -o imgconv +$ ./imgconv -dir ./img + or +$ ./imgconv -dir ./img -from=png -to=jpg + +-dir 対象のディレクトリのパスを指定 +-from 変換する予定の画像の拡張子を指定 +-to 変換後の画像の拡張子を指定 +``` + +# 感想 + +「ユーザ定義型を作ってみる」という課題がどうしようか結構迷いました。 +特になくても作れそうだったのでどう取り入れればわかりやすいかと自分なりに考えてやってみました。 + +また、GoDocも普段あまり書くことを意識していなかったのでこれで良さそうなのかわかっていないです。 +publicなものだけに記述していますが、GoDocの事を考えてもうすこしpublicに切り出せるものは出してあげても良かったのかなと思ったりしています。 diff --git a/kadai1/ryokky59/cmd/imgconv/main.go b/kadai1/ryokky59/cmd/imgconv/main.go new file mode 100644 index 0000000..436e3de --- /dev/null +++ b/kadai1/ryokky59/cmd/imgconv/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/gopherdojo/dojo8/kadai1/ryokky59/convert" +) + +var converter convert.ImgConverter + +func init() { + flag.StringVar(&converter.Dir, "dir", "./", "対象のディレクトリ") + flag.StringVar(&converter.From, "from", "jpg", "変換する対象の画像の拡張子") + flag.StringVar(&converter.To, "to", "png", "変換した後の画像の拡張子") + flag.Parse() +} + +func main() { + if converter.From != "png" && + converter.From != "jpeg" && + converter.From != "jpg" && + converter.From != "gif" && + converter.From != "bmp" && + converter.From != "tiff" { + fmt.Errorf("Unsupported extension in from") + os.Exit(1) + } + + if converter.To != "png" && + converter.To != "jpeg" && + converter.To != "jpg" && + converter.To != "gif" && + converter.To != "bmp" && + converter.To != "tiff" { + fmt.Errorf("Unsupported extension in to") + os.Exit(1) + } + + if converter.From == converter.To { + fmt.Errorf("from and to are conflict") + os.Exit(1) + } + + if f, err := os.Stat(converter.Dir); os.IsNotExist(err) || !f.IsDir() { + fmt.Errorf("Directory does not exist") + os.Exit(1) + } + + if err := convert.Exec(&converter); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/kadai1/ryokky59/convert/convert.go b/kadai1/ryokky59/convert/convert.go new file mode 100644 index 0000000..16ca602 --- /dev/null +++ b/kadai1/ryokky59/convert/convert.go @@ -0,0 +1,101 @@ +package convert + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" +) + +// Exec 画像の変換を実行する +func Exec(converter *ImgConverter) error { + err := filepath.Walk(converter.Dir, func(path string, info os.FileInfo, err error) error { + if strings.HasSuffix(info.Name(), converter.From) { + converter.Name = strings.TrimRight(info.Name(), converter.From) + err := converter.convert() + if err != nil { + return err + } + } + return nil + }) + if err != nil { + return err + } + + return nil +} + +// ImgConverter 画像の拡張子を変換する +type ImgConverter struct { + Dir string + Name string + From string + To string +} + +func (c *ImgConverter) convert() error { + file, err := os.Open(c.path()) + if err != nil { + return err + } + defer file.Close() + + img, _, err := image.Decode(file) + if err != nil { + return err + } + + dst, err := os.Create(c.dstPath()) + defer dst.Close() + if err != nil { + return err + } + + switch strings.ToLower(c.To) { + case "png": + err = png.Encode(dst, img) + if err != nil { + return err + } + case "jpeg", "jpg": + err = jpeg.Encode(dst, img, nil) + if err != nil { + return err + } + case "gif": + err = gif.Encode(dst, img, nil) + if err != nil { + return err + } + case "bmp": + err = bmp.Encode(dst, img) + if err != nil { + return err + } + case "tiff": + err = tiff.Encode(dst, img, nil) + if err != nil { + return err + } + default: + return fmt.Errorf("Unsupported extension") + } + + return nil +} + +func (c *ImgConverter) path() string { + return c.Dir + c.Name + c.From +} + +func (c *ImgConverter) dstPath() string { + return c.Dir + c.Name + c.To +} diff --git a/kadai1/ryokky59/go.mod b/kadai1/ryokky59/go.mod new file mode 100644 index 0000000..2278dbd --- /dev/null +++ b/kadai1/ryokky59/go.mod @@ -0,0 +1,5 @@ +module github.com/gopherdojo/dojo8/kadai1/ryokky59 + +go 1.14 + +require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai1/ryokky59/go.sum b/kadai1/ryokky59/go.sum new file mode 100644 index 0000000..394251b --- /dev/null +++ b/kadai1/ryokky59/go.sum @@ -0,0 +1,3 @@ +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai1/ryokky59/img/nomikai_1.jpg b/kadai1/ryokky59/img/nomikai_1.jpg new file mode 100644 index 0000000..a1d1ac1 Binary files /dev/null and b/kadai1/ryokky59/img/nomikai_1.jpg differ diff --git a/kadai1/ryokky59/img/nomikai_2.jpg b/kadai1/ryokky59/img/nomikai_2.jpg new file mode 100644 index 0000000..73dc390 Binary files /dev/null and b/kadai1/ryokky59/img/nomikai_2.jpg differ