image.go 1.2 KB

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