image.go 1.3 KB

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