82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"image/jpeg"
|
|
"image/png"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/nfnt/resize"
|
|
)
|
|
|
|
func Resize(maxWidth uint, h http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rc := ResponseCollector{}
|
|
req := *r
|
|
h.ServeHTTP(&rc, &req)
|
|
imageResp := rc.CollectResponse()
|
|
|
|
if imageResp.Code != 200 {
|
|
imageResp.WriteResponse(rw)
|
|
return
|
|
}
|
|
|
|
typ, hasType := imageResp.Headers["Content-Type"]
|
|
if !hasType || len(typ) == 0 {
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("could not determine content type of image"))
|
|
return
|
|
}
|
|
|
|
buf := bytes.NewBuffer(imageResp.Body)
|
|
log.Println("buf len: ", buf.Len())
|
|
switch typ[0] {
|
|
case "image/png":
|
|
image, err := png.Decode(buf)
|
|
if err != nil {
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("error while decoding png: " + err.Error()))
|
|
return
|
|
}
|
|
resizedImage := resize.Thumbnail(maxWidth, 100000, image, resize.NearestNeighbor)
|
|
resizedBuf := new(bytes.Buffer)
|
|
encoder := png.Encoder{CompressionLevel: png.BestCompression}
|
|
if encodeErr := encoder.Encode(resizedBuf, resizedImage); encodeErr != nil {
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("error while encoding png: " + err.Error()))
|
|
return
|
|
}
|
|
rw.Header().Add("Content-Type", "image/png")
|
|
rw.Write(resizedBuf.Bytes())
|
|
case "image/jpeg":
|
|
image, err := jpeg.Decode(buf)
|
|
if err != nil {
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("error while decoding jpeg: " + err.Error()))
|
|
return
|
|
}
|
|
log.Println("resizing ", r.URL.String(), "(", image.Bounds().Max.X, ") to ", maxWidth)
|
|
resizedImage := resize.Thumbnail(maxWidth, 100000, image, resize.Lanczos3)
|
|
resizedBuf := new(bytes.Buffer)
|
|
jpegOptions := jpeg.Options{Quality: 75}
|
|
if encodeErr := jpeg.Encode(resizedBuf, resizedImage, &jpegOptions); encodeErr != nil {
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("error while encoding jpeg: " + err.Error()))
|
|
return
|
|
}
|
|
rw.Header().Add("Content-Type", "image/jpeg")
|
|
log.Println("resized size: ", resizedBuf.Len())
|
|
rw.Write(resizedBuf.Bytes())
|
|
case "text/html":
|
|
rw.WriteHeader(415)
|
|
rw.Write([]byte("can't resize html files"))
|
|
return
|
|
default:
|
|
rw.WriteHeader(501)
|
|
rw.Write([]byte("unimplemented"))
|
|
return
|
|
}
|
|
})
|
|
}
|