svg.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package metadata
  2. import (
  3. "bytes"
  4. "errors"
  5. "image"
  6. "image/jpeg"
  7. "path/filepath"
  8. "github.com/nfnt/resize"
  9. "github.com/oliamb/cutter"
  10. "github.com/srwiley/oksvg"
  11. "github.com/srwiley/rasterx"
  12. "imuslab.com/arozos/mod/filesystem"
  13. )
  14. func generateThumbnailForSVG(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {
  15. if fsh.RequireBuffer {
  16. return "", nil
  17. }
  18. fshAbs := fsh.FileSystemAbstraction
  19. if !fshAbs.FileExists(file) {
  20. return "", errors.New("Source not exists")
  21. }
  22. //Read the SVG content
  23. content, err := fshAbs.ReadFile(file)
  24. if err != nil {
  25. return "", err
  26. }
  27. //Parse SVG
  28. icon, err := oksvg.ReadIconStream(bytes.NewReader(content))
  29. if err != nil {
  30. return "", err
  31. }
  32. //Set target size for rendering
  33. icon.SetTarget(0, 0, 480, 480)
  34. //Create RGBA image
  35. img := image.NewRGBA(image.Rect(0, 0, 480, 480))
  36. //Create scanner and rasterizer
  37. scanner := rasterx.NewScannerGV(480, 480, img, img.Bounds())
  38. raster := rasterx.NewDasher(480, 480, scanner)
  39. //Draw the SVG
  40. icon.Draw(raster, 1.0)
  41. //Resize to desired width (similar to other generators)
  42. b := img.Bounds()
  43. imgWidth := b.Max.X
  44. imgHeight := b.Max.Y
  45. var m image.Image
  46. if imgWidth > imgHeight {
  47. m = resize.Resize(0, 480, img, resize.Lanczos3)
  48. } else {
  49. m = resize.Resize(480, 0, img, resize.Lanczos3)
  50. }
  51. //Crop out the center
  52. croppedImg, err := cutter.Crop(m, cutter.Config{
  53. Width: 480,
  54. Height: 480,
  55. Mode: cutter.Centered,
  56. })
  57. if err != nil {
  58. return "", err
  59. }
  60. //Create the thumbnail
  61. outputFile := cacheFolder + filepath.Base(file) + ".jpg"
  62. out, err := fshAbs.Create(outputFile)
  63. if err != nil {
  64. return "", err
  65. }
  66. //Write new image to file
  67. jpeg.Encode(out, croppedImg, nil)
  68. out.Close()
  69. if !generateOnly {
  70. //Return the image as well
  71. ctx, err := getImageAsBase64(fsh, outputFile)
  72. return ctx, err
  73. } else {
  74. return "", nil
  75. }
  76. }