Files

61 lines
1.4 KiB
Go

package plg_image_golang
import (
"bytes"
. "github.com/mickael-kerjean/filestash/server/common"
"golang.org/x/image/draw"
"image"
_ "image/gif"
_ "image/jpeg"
"image/png"
"io"
"net/http"
)
const THUMB_SIZE int = 150
func init() {
Hooks.Register.Thumbnailer("image/jpeg", thumbnailer{})
Hooks.Register.Thumbnailer("image/png", thumbnailer{})
Hooks.Register.Thumbnailer("image/gif", thumbnailer{})
}
type thumbnailer struct{}
func (this thumbnailer) Generate(reader io.ReadCloser, ctx *App, res *http.ResponseWriter, req *http.Request) (io.ReadCloser, error) {
query := req.URL.Query()
mType := GetMimeType(query.Get("path"))
if query.Get("thumbnail") != "true" {
return reader, nil
} else if mType != "image/jpeg" && mType != "image/png" && mType != "image/gif" {
return reader, nil
}
src, _, err := image.Decode(reader)
if err != nil {
return reader, nil
}
ratio := func(i image.Image) int {
b := src.Bounds()
max := b.Max.X
if b.Max.X < b.Max.Y {
max = b.Max.Y
}
r := max / THUMB_SIZE
if r <= 1 {
return 1
}
return r
}(src)
dst := image.NewRGBA(image.Rect(0, 0, src.Bounds().Max.X/ratio, src.Bounds().Max.Y/ratio))
draw.ApproxBiLinear.Scale(dst, dst.Rect, src, src.Bounds(), draw.Over, nil)
output := bytes.NewBuffer([]byte(""))
if err = png.Encode(output, dst); err != nil {
return reader, err
}
return NewReadCloserFromBytes(output.Bytes()), nil
}