Go言語でグレースケールの画像に変換

June 12, 2014

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

image以下のパッケージを使うとピクセル単位で画像処理が行なえる。 interfaceで宣言された抽象的な型が用意されているので、色々拡張できそう。

今回は、png画像をグレースケールにしてみる。 下記のプログラムは、標準入力から画像を取得し、標準出力に書き出す。 Image.Bounds()で画像の領域を取得し、Gray16ModelGray16に色を変換している。 Gray16以外にもRGBAなどの色があり、色ごとに-Modelがある。 もちろん、自前でColorインタフェースを実装することは可能である。

package main

import (
    "image"
    "image/color"
    "image/png"
    "os"
)

func main() {
    img, _ := png.Decode(os.Stdin)
    bounds := img.Bounds()
    dest := image.NewGray16(bounds)
    for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
        for x := bounds.Min.X; x < bounds.Max.X; x++ {
            c := color.Gray16Model.Convert(img.At(x, y))
            gray, _ := c.(color.Gray16)
            dest.Set(x, y, gray)
        }
    }
    png.Encode(os.Stdout, dest)
}

実行してみる。

$ go run gray.go < gopher.png > gopher_gray.png

以下のように変換される。

入力

gopher.png

出力

gopher_gray.png