mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-30 17:46:41 +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
 | |
| }
 | 
