image.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package renderer
  2. import (
  3. "errors"
  4. "image"
  5. "image/jpeg"
  6. "os"
  7. "path/filepath"
  8. "github.com/nfnt/resize"
  9. "github.com/oliamb/cutter"
  10. )
  11. // Generate thumbnail for image. Output file will have the same name as the input file with .jpg extension
  12. func generateThumbnailForImage(inputFile string, outputFolder string) error {
  13. var img image.Image
  14. var err error
  15. fileInfo, err := os.Stat(inputFile)
  16. if err != nil {
  17. return errors.New("failed to get file info: " + err.Error())
  18. }
  19. if fileInfo.Size() > (25 << 20) {
  20. // Maximum image size to be converted is 25MB
  21. return errors.New("image file too large")
  22. }
  23. srcImage, err := os.OpenFile(inputFile, os.O_RDONLY, 0775)
  24. if err != nil {
  25. return err
  26. }
  27. defer srcImage.Close()
  28. img, _, err = image.Decode(srcImage)
  29. if err != nil {
  30. return err
  31. }
  32. //Resize to desiered width
  33. //Check boundary to decide resize mode
  34. b := img.Bounds()
  35. imgWidth := b.Max.X
  36. imgHeight := b.Max.Y
  37. var m image.Image
  38. if imgWidth > imgHeight {
  39. m = resize.Resize(0, 480, img, resize.Lanczos3)
  40. } else {
  41. m = resize.Resize(480, 0, img, resize.Lanczos3)
  42. }
  43. //Crop out the center
  44. croppedImg, err := cutter.Crop(m, cutter.Config{
  45. Width: 480,
  46. Height: 480,
  47. Mode: cutter.Centered,
  48. })
  49. //Create the thumbnail
  50. outputFilename := filepath.Join(outputFolder, filepath.Base(inputFile))
  51. out, err := os.Create(outputFilename + ".jpg")
  52. if err != nil {
  53. return err
  54. }
  55. // write new image to file
  56. jpeg.Encode(out, croppedImg, nil)
  57. out.Close()
  58. return nil
  59. }