mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-11-04 05:27:04 +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
 | 
						|
	})
 | 
						|
}
 |