説明
JPEG画像をグレー画像に変換した後、PNG形式で保存するには必要なパッケージを読み込ませます。osパッケージのOpen()メソッドを使って読み込むJPEG形式の画像があるパスを指定し開きます。無事に開くことができたら、imageパッケージのDecode()メソッドを使ってJPEG画像を展開(デコード)します。
次に画像と同じサイズの四角形を作成しDraw()メソッドを使ってJPEG画像を描画します。描画した画像のピクセルをAt()メソッドとRGBA()メソッドを使って読み出します。At()メソッドで座標を指定し、RGBA()メソッドで赤緑青α(不透明度)を一括して読み出します。グレースケール画像にするには「緑の輝度×0.59 + 赤の輝度×0.3 + 青の輝度×0.11」として計算します。計算した値を赤緑青の輝度として書き戻します。ピクセル情報を書き込むにはSet()メソッドを使います。これを全ピクセル数分繰り返します。
画像の書類が終わったらにPNG画像の保存先とファイル名をCreate()メソッドを使って生成します。ファイルが正常に作成されたらjpegパッケージのEncode()メソッドを使って画像を保存します。
package main
import (
"fmt"
"image"
"os"
"image/color"
"image/draw"
"image/png"
_ "image/jpeg"
)
func main() {
// 開くファイル名
file, err := os.Open("/images/test.jpg")
if err != nil {
fmt.Println("ファイルが開けませんでした。")
os.Exit(1)
}
defer file.Close()
// JPEG画像を解析(デコード)する
m, _, err := image.Decode(file)
if err != nil {
fmt.Println("画像を解析できませんでした。")
os.Exit(1)
}
// 画像サイズの四角形を生成
myImage := image.NewRGBA(m.Bounds())
// 黒色で四角形を描画
draw.Draw(myImage, myImage.Bounds(), m, image.Point{0, 0}, draw.Src)
// グレースケールにする処理
// 画像の幅を取得する
bounds := m.Bounds()
// 縦幅の数だけ繰り返す
for y := bounds.Min.Y; y<bounds.Max.Y; y++ {
// 横幅の数だけ繰り返す
for x := bounds.Min.X; x<bounds.Max.X; x++ {
// ピクセルの輝度を読み出し
r, g, b, a := myImage.At(x, y).RGBA()
// グレースケールの値を計算する
gray := float64(g & 0xff)*0.59 + float64(r & 0xff)*0.3 + float64(b & 0xff)*0.11
// ピクセル値を書き込み
myImage.Set(x, y, color.RGBA{uint8(gray), uint8(gray), uint8(gray), uint8(a)})
}
}
// 保存するファイル名
savefile, err := os.Create("/images/test_gray1.png")
if err != nil {
fmt.Println("保存するためのファイルが作成できませんでした。")
os.Exit(1)
}
defer savefile.Close()
// PNG形式で保存する
png.Encode(savefile, myImage)
}