mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-11-01 02:43:35 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.2 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.ProcessFileContentBeforeSend(func(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
 | |
| 	})
 | |
| }
 | 
