mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2025-10-28 04:05:21 +08:00
61 lines
1.4 KiB
Go
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
|
|
}
|