Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kadai4-takata #51

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
22 changes: 22 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
kadai1/takata/takata
kadai1/takata/output/1.png
kadai1/takata/output/10.png
kadai1/takata/output/2.png
kadai1/takata/output/3.png
kadai1/takata/output/4.png
kadai1/takata/output/5.png
kadai1/takata/output/6.png
kadai1/takata/output/7.png
kadai1/takata/output/8.png
kadai1/takata/output/9.png
kadai2/takata/takata
kadai2/takata/output/1.png
kadai2/takata/output/10.png
kadai2/takata/output/2.png
kadai2/takata/output/3.png
kadai2/takata/output/4.png
kadai2/takata/output/5.png
kadai2/takata/output/6.png
kadai2/takata/output/7.png
kadai2/takata/output/8.png
kadai2/takata/output/9.png
57 changes: 57 additions & 0 deletions kadai1/takata/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Kadai1


## 実行方法

```
go build -o converter main.go
./converter -d test -sf jpg -df png

または

go run main.go -d test -sf jpg -df png


出力結果はoutputディレクトリに格納される
```


## Options

```
-d 変換対象の画像が入ったディレクトリ(中にディレクトリを含めてもOK)

-sf 変換前のフォーマット(jpg,jpeg,png,gifが指定可能) デフォルトはjpg

-df 変換後のフォーマット(jpg,jpeg,png,gifが指定可能) デフォルトはpng


```

## 課題の回答

### ディレクトリを指定する
`flag.Args()`で受け取る値を対象のディレクトリとしました。

### ディレクトリ以下は再帰的に処理する
dirwalkメソッドの中でディレクトリの場合はさらにディレクトリ内のファイルを探すようにしました。


### 指定したディレクトリ以下のJPGファイルをPNGに変換

オプションを指定しなかった場合、デフォルトでjpgファイルをpngファイルに変換するようにしました。

### mainパッケージと分離する
画像変換処理をconvertパッケージに格納し、mainパッケージへimportして呼び出すようにしました。


### ユーザ定義型を作ってみる
Fileタイプを作成しました。ファイル名と変換元のファイル形式、変換後のファイル形式を格納します。

### GoDocを生成してみる

```
godoc -http:3000
```

で作成しました。
167 changes: 167 additions & 0 deletions kadai1/takata/convert/convert.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/*
Package convert provides convert function
to some extension to other extension
*/
package convert

import (
"fmt"
"image"
"image/gif"
"image/jpeg"
"image/png"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
)

// Convert images with srcFmt in dir to images with dstFmt
func Convert(dir string, srcFmt string, dstFmt string) {

if !exists(dir) {
panic("ディレトリは存在しません")
}

fInfo, _ := os.Stat(dir)
if !fInfo.IsDir() {
panic("ディレクトリを指定してください")
}

files := dirwalk(dir, srcFmt, dstFmt)

for _, file := range files {
convertImage(file)
}
}

// find files with some extension in a directory recursively
func dirwalk(dir string, srcFmt string, dstFmt string) []FileInformation {

files, err := ioutil.ReadDir(dir)
if err != nil {
panic(err)
}

var paths []FileInformation
for _, file := range files {
if file.IsDir() {
paths = append(paths, dirwalk(filepath.Join(dir, file.Name()), srcFmt, dstFmt)...)
continue
}
name := file.Name()
pos := strings.LastIndex(name, ".") + 1
if name[pos:] != srcFmt {
continue
}

path := FileInformation{filepath.Join(dir, name[:pos-1]), srcFmt, dstFmt}
paths = append(paths, path)
}
return paths
}

// convert file with some extension to file with other extension
func convertImage(src FileInformation) {

if !isAvailableFormat(src.srcFmt) {
log.Fatal("指定した変換元の画像形式は無効です")
return
}

if !isAvailableFormat(src.dstFmt) {
log.Fatal("指定した変換先の画像形式は無効です")
return
}

startConvert(src)
}

// Encode the targer image
func startConvert(src FileInformation) {

file, err := os.Open(src.name + "." + src.srcFmt)
if err != nil {
log.Fatal(err)
return
}
defer file.Close()

img, _, err := decode(file)
if err != nil {
log.Fatal(err)
return
}

dstFile := makeDstFile(src)

out, err := os.Create(dstFile)
defer out.Close()

if !encode(src.dstFmt, out, img) {
log.Fatal("encodeに失敗")
}
}

// decode file
func decode(file *os.File) (image.Image, string, error) {
return image.Decode(file)
}

// encode image to dstFormat
func encode(format string, out *os.File, img image.Image) bool {

switch format {
case "jpeg", "jpg":
jpeg.Encode(out, img, nil)
return true
case "gif":
gif.Encode(out, img, nil)
return true
case "png":
png.Encode(out, img)
return true
default:
return false
}
}

// make destination file
func makeDstFile(src FileInformation) string {
dstDir := "output"
if _, err := os.Stat(dstDir); os.IsNotExist(err) {
os.Mkdir(dstDir, 0777)
}
return dstDir + "/" + fmt.Sprintf("%s.%s", getFileNameWithoutExt(src.name), src.dstFmt)
}

// check if this format is avalable
func isAvailableFormat(format string) bool {
lowerFormat := strings.ToLower(format)
switch lowerFormat {
case "jpg", "jpeg", "png", "gif":
return true
default:
return false

}
}

// Get file name withour extension
func getFileNameWithoutExt(path string) string {
return filepath.Base(path[:len(path)-len(filepath.Ext(path))])
}

// Check if file exists
func exists(filename string) bool {
_, err := os.Stat(filename)
return err == nil
}

// FileInformation contains Name and srcFmt and dstFmt.
type FileInformation struct {
name string // name of a file
srcFmt string // original format of a file
dstFmt string // format to convert
}
19 changes: 19 additions & 0 deletions kadai1/takata/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package main

import (
"convert"
"flag"
)

// main
func main() {
var (
dir = flag.String("d", "", "directory to convert imagefiles")
srcFmt = flag.String("sf", "jpg", "src file format")
dstFmt = flag.String("df", "png", "dest file format")
)

flag.Parse()

convert.Convert(*dir, *srcFmt, *dstFmt)
}
Binary file added kadai1/takata/test/1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/3.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/4.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/5.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/inner/10.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/inner/6.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/inner/7.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/inner/8.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added kadai1/takata/test/inner/9.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
91 changes: 91 additions & 0 deletions kadai2/takata/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Kadai1


## 実行方法

```
go build -o converter main.go
./converter -d test -sf jpg -df png

または

go run main.go -d test -sf jpg -df png


出力結果はoutputディレクトリに格納される
```


## Options

```
-d 変換対象の画像が入ったディレクトリ(中にディレクトリを含めてもOK)

-sf 変換前のフォーマット(jpg,jpeg,png,gifが指定可能) デフォルトはjpg

-df 変換後のフォーマット(jpg,jpeg,png,gifが指定可能) デフォルトはpng


```

## 課題1の回答

### ディレクトリを指定する
`flag.Args()`で受け取る値を対象のディレクトリとしました。

### ディレクトリ以下は再帰的に処理する
dirwalkメソッドの中でディレクトリの場合はさらにディレクトリ内のファイルを探すようにしました。


### 指定したディレクトリ以下のJPGファイルをPNGに変換

オプションを指定しなかった場合、デフォルトでjpgファイルをpngファイルに変換するようにしました。

### mainパッケージと分離する
画像変換処理をconvertパッケージに格納し、mainパッケージへimportして呼び出すようにしました。


### ユーザ定義型を作ってみる
Fileタイプを作成しました。ファイル名と変換元のファイル形式、変換後のファイル形式を格納します。

### GoDocを生成してみる

```
godoc -http:3000
```

で作成しました。


## 課題2の回答

## io.Readerとio.Writerについて調べてみよう

### 標準パッケージでどのように使われているか

サポートしている標準パッケージ
- json
- bytes.Buffer
- bufio.Reader
- os.File
- image
- jpeg
- png
- base64

インターフェイスを実装していたり、引数として扱えるようにしている。

### io.Readerとio.Writerがあることでどういう利点があるのか

- io.Readerとio.Writerを満たした構造体(クラス)を同じように扱える
読み込み元や出力先がファイル、画面、バッファ、ネットワークなどのデータの種類に関わらず[]byteでさえあれば全て同じように処理できる。

また、例えば引数としてio.Reader型を宣言している場合、
os.Stdinやos.Fileなどio.Readerを満たしている全ての構造体を同じように扱える。

また、テスト時にio.Readerとio.Writerを実装したモックを作成することで、
入出力先をローカルファイルなどにすることでテストがやりやすくなる。




Loading