golangで画像ファイルをリサイズしてファイル書き出ししないで出力する

コードは前回のエントリ(golangで静的ファイルを出力する)への追加になってます。

いちいちファイルをローカルに書き出ししないで出力したいケースに使います。リサイズ自体はnfnt/resizeがよく使われてるっぽいのでこちらを。

go get github.com/nfnt/resize

でインストール。

package main

import (
	"github.com/nfnt/resize"
	"image"
	"image/jpeg"
	"net/http"
	"os"
)

func StaticHandler(w http.ResponseWriter, r *http.Request) {

	http.ServeFile(w, r, "img.jpg")
}

func ResizeHandler(w http.ResponseWriter, r *http.Request) {

	_file, err := os.Open("img.jpg")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	_image, _, err := image.Decode(_file)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	_resized := resize.Resize(320, 0, _image, resize.NearestNeighbor)

	jpeg.Encode(w, _resized, nil)
}

func main() {
	http.HandleFunc("/foo.jpg", StaticHandler)
	http.HandleFunc("/bar.jpg", ResizeHandler)
	http.ListenAndServe(":15100", nil)
}

image.Decode(_file) で生成されたオブジェクトはExif情報は破棄されるようです。ので、事前にExif読んで縦画像であれば回転させる処理も追加しないとです。そこは次回調べておこう。