| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | package metadataimport (	"bytes"	"errors"	"image"	"image/jpeg"	"os"	"path/filepath"	"github.com/nfnt/resize"	"github.com/oliamb/cutter"	"imuslab.com/arozos/mod/filesystem")// Generate thumbnail for image. Require real filepathfunc generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {	if fsh.RequireBuffer {		return "", nil	}	fshAbs := fsh.FileSystemAbstraction	var img image.Image	var err error	if fshAbs.GetFileSize(file) > (25 << 20) {		//Maxmium image size to be converted is 25MB, on 500MB (~250MB usable) Linux System		//This file is too large to convert		return "", errors.New("image file too large")	}	if fsh.RequireBuffer {		//This fsh is remote. Buffer to RAM		imageBytes, err := fshAbs.ReadFile(file)		if err != nil {			return "", err		}		img, _, err = image.Decode(bytes.NewReader(imageBytes))		if err != nil {			return "", err		}	} else {		srcImage, err := fshAbs.OpenFile(file, os.O_RDONLY, 0775)		if err != nil {			return "", err		}		defer srcImage.Close()		img, _, err = image.Decode(srcImage)		if err != nil {			return "", err		}	}	//Resize to desiered width	//Check boundary to decide resize mode	b := img.Bounds()	imgWidth := b.Max.X	imgHeight := b.Max.Y	var m image.Image	if imgWidth > imgHeight {		m = resize.Resize(0, 480, img, resize.Lanczos3)	} else {		m = resize.Resize(480, 0, img, resize.Lanczos3)	}	//Crop out the center	croppedImg, err := cutter.Crop(m, cutter.Config{		Width:  480,		Height: 480,		Mode:   cutter.Centered,	})	//Create the thumbnail	out, err := fshAbs.Create(cacheFolder + filepath.Base(file) + ".jpg")	if err != nil {		return "", err	}	// write new image to file	jpeg.Encode(out, croppedImg, nil)	out.Close()	if !generateOnly {		//return the image as well		ctx, err := getImageAsBase64(fsh, cacheFolder+filepath.Base(file)+".jpg")		return ctx, err	} else {		return "", nil	}}
 |