Edited at

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

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

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


入力


出力