image.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package metadata
  2. import (
  3. "bytes"
  4. "image"
  5. "image/jpeg"
  6. "os"
  7. "path/filepath"
  8. "github.com/nfnt/resize"
  9. "github.com/oliamb/cutter"
  10. "imuslab.com/arozos/mod/filesystem"
  11. )
  12. func generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {
  13. fshAbs := fsh.FileSystemAbstraction
  14. imageBytes, err := fshAbs.ReadFile(file)
  15. if err != nil {
  16. return "", err
  17. }
  18. //Resize to desiered width
  19. img, _, err := image.Decode(bytes.NewReader(imageBytes))
  20. if err != nil {
  21. return "", err
  22. }
  23. //Check boundary to decide resize mode
  24. b := img.Bounds()
  25. imgWidth := b.Max.X
  26. imgHeight := b.Max.Y
  27. var m image.Image
  28. if imgWidth > imgHeight {
  29. m = resize.Resize(0, 480, img, resize.Lanczos3)
  30. } else {
  31. m = resize.Resize(480, 0, img, resize.Lanczos3)
  32. }
  33. //Crop out the center
  34. croppedImg, err := cutter.Crop(m, cutter.Config{
  35. Width: 480,
  36. Height: 480,
  37. Mode: cutter.Centered,
  38. })
  39. //Create the thumbnail
  40. out, err := os.Create(cacheFolder + filepath.Base(file) + ".jpg")
  41. if err != nil {
  42. return "", err
  43. }
  44. // write new image to file
  45. jpeg.Encode(out, croppedImg, nil)
  46. out.Close()
  47. if !generateOnly {
  48. //return the image as well
  49. ctx, err := getImageAsBase64(fsh, cacheFolder+filepath.Base(file)+".jpg")
  50. return ctx, err
  51. } else {
  52. return "", nil
  53. }
  54. }