LoginSignup
3
1

More than 3 years have passed since last update.

golangで画像サイズ/拡張子を変換するCLIツールを作ってみた

Posted at

画層サイズ・拡張子を変更する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)
        }
    }

参考

flagパッケージ使用メモ
GoでCLIを作る時に便利なurfave/cli

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1