画層サイズ・拡張子を変更するCLIツールを作りました。
使用したパッケージ
flag
flag管理パッケージ( コマンドライン引数とかを扱う時に便利。という理解。 )
image
画像を取り扱う標準パッケージ
golang.org/x/image/draw
ある画像を別の画像に描画するパッケージ。imageパッケージだけではやってくれないっぽい。準標準パッケージらしい
github.com/urfave/cli
CLIツール作成のに便利なパッケージ。
usageとかいろいろいい感じに出してくれる。
処理の大まかな流れ
flagを使ってコマンドライン引数を取得
必要なパラメータをflag形式で受け取り flag.Parse()
でコマンドラインのパラメータがパースされ、
各変数に値が格納される。
// 引数を取得
srcImagePath := flag.String("src_path", "", "source image path")
dstImagePath := flag.String("dst_path", "", "destination image path")
dstFormat := flag.String("dst_format", "", "destination image format. e.g) png,jpeg,gif")
height := flag.Int("height", 0, "height size")
width := flag.Int("width", 0, "width size")
flag.Parse()
画像をリサイズ
ファイルを開き画像情報を取得する。
取得した画像情報をもとに
出力用の画像を作り保存する。
// srcファイルを開く
srcImgFile, err := os.Open(*srcImagePath)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
defer srcImgFile.Close()
// 画像読み込み
srcImg, _, err := image.Decode(srcImgFile)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
srcRct := srcImg.Bounds()
dstImg := image.NewRGBA(image.Rect(0, 0, *width, *height))
dstRct := dstImg.Bounds()
draw.CatmullRom.Scale(dstImg, dstRct, srcImg, srcRct, draw.Over, nil)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
指定の画像形式にエンコードする
画像ファイルを作成し、作成した画像をエンコードしてファイルに保存する。
// 指定の拡張子にエンコード
dstImgFile, err := os.Create(*dstImagePath)
defer dstImgFile.Close()
switch *dstFormat {
case "jpeg":
err := jpeg.Encode(dstImgFile, dstImg, &jpeg.Options{Quality: 100})
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
case "gif":
err := gif.Encode(dstImgFile, dstImg, nil)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
case "png":
err := png.Encode(dstImgFile, dstImg)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
}