🐥

Goを使った画像のサイズ変更

2021/03/18に公開

画像オブジェクト取得

標準の image パッケージを利用しても良いですが、EXIF等の対応を良い感じにしてくれる下記ライブラリを使うのが楽です。
https://github.com/disintegration/imageorient

リサイズ

rImg := resize.Resize(width, height, img, resize.Bilinear)

再生成

imgBuf := new(bytes.Buffer)

// jpg
err = jpeg.Encode(imgBuf, rImg, &jpeg.Options{
    Quality: 80,
})

// png
err = png.Encode(imgBuf, rImg)

// gif
err = gif.Encode(imgBuf, rImg, nil)

おまけ: 支配色(ドミナントカラー)の取得

サムネ表示等で背景色を画像の色に合わせたいとかよくあるかと思います。
そんなときに便利な処理です。

func (s *Service) getDominantColor(img image.Image) color.RGBA {
	var r, g, b, count float64
	rect := img.Bounds()
	for i := 0; i < rect.Max.Y; i++ {
		for j := 0; j < rect.Max.X; j++ {
			c := color.RGBAModel.Convert(img.At(j, i))
			r += float64(c.(color.RGBA).R)
			g += float64(c.(color.RGBA).G)
			b += float64(c.(color.RGBA).B)
			count++
		}
	}
	return color.RGBA{
		R: uint8(r / count),
		G: uint8(g / count),
		B: uint8(b / count),
	}
}

Discussion