コードは前回のエントリ(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読んで縦画像であれば回転させる処理も追加しないとです。そこは次回調べておこう。