12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- package metadata
- import (
- "bytes"
- "errors"
- "image"
- "image/jpeg"
- "path/filepath"
- "github.com/nfnt/resize"
- "github.com/oliamb/cutter"
- "github.com/srwiley/oksvg"
- "github.com/srwiley/rasterx"
- "imuslab.com/arozos/mod/filesystem"
- )
- func generateThumbnailForSVG(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {
- if fsh.RequireBuffer {
- return "", nil
- }
- fshAbs := fsh.FileSystemAbstraction
- if !fshAbs.FileExists(file) {
- return "", errors.New("Source not exists")
- }
- //Read the SVG content
- content, err := fshAbs.ReadFile(file)
- if err != nil {
- return "", err
- }
- //Parse SVG
- icon, err := oksvg.ReadIconStream(bytes.NewReader(content))
- if err != nil {
- return "", err
- }
- //Set target size for rendering
- icon.SetTarget(0, 0, 480, 480)
- //Create RGBA image
- img := image.NewRGBA(image.Rect(0, 0, 480, 480))
- //Create scanner and rasterizer
- scanner := rasterx.NewScannerGV(480, 480, img, img.Bounds())
- raster := rasterx.NewDasher(480, 480, scanner)
- //Draw the SVG
- icon.Draw(raster, 1.0)
- //Resize to desired width (similar to other generators)
- 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,
- })
- if err != nil {
- return "", err
- }
- //Create the thumbnail
- outputFile := cacheFolder + filepath.Base(file) + ".jpg"
- out, err := fshAbs.Create(outputFile)
- 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, outputFile)
- return ctx, err
- } else {
- return "", nil
- }
- }
|