image.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package metadata
  2. import (
  3. "bytes"
  4. "errors"
  5. "image"
  6. "image/jpeg"
  7. "os"
  8. "path/filepath"
  9. "github.com/nfnt/resize"
  10. "github.com/oliamb/cutter"
  11. "imuslab.com/arozos/mod/filesystem"
  12. )
  13. // Generate thumbnail for image. Require real filepath
  14. func generateThumbnailForImage(fsh *filesystem.FileSystemHandler, cacheFolder string, file string, generateOnly bool) (string, error) {
  15. if fsh.RequireBuffer {
  16. return "", nil
  17. }
  18. fshAbs := fsh.FileSystemAbstraction
  19. var img image.Image
  20. var err error
  21. if fshAbs.GetFileSize(file) > (25 << 20) {
  22. //Maxmium image size to be converted is 25MB, on 500MB (~250MB usable) Linux System
  23. //This file is too large to convert
  24. return "", errors.New("image file too large")
  25. }
  26. if fsh.RequireBuffer {
  27. //This fsh is remote. Buffer to RAM
  28. imageBytes, err := fshAbs.ReadFile(file)
  29. if err != nil {
  30. return "", err
  31. }
  32. img, _, err = image.Decode(bytes.NewReader(imageBytes))
  33. if err != nil {
  34. return "", err
  35. }
  36. } else {
  37. srcImage, err := fshAbs.OpenFile(file, os.O_RDONLY, 0775)
  38. if err != nil {
  39. return "", err
  40. }
  41. defer srcImage.Close()
  42. img, _, err = image.Decode(srcImage)
  43. if err != nil {
  44. return "", err
  45. }
  46. }
  47. //Resize to desiered width
  48. //Check boundary to decide resize mode
  49. b := img.Bounds()
  50. imgWidth := b.Max.X
  51. imgHeight := b.Max.Y
  52. var m image.Image
  53. if imgWidth > imgHeight {
  54. m = resize.Resize(0, 480, img, resize.Lanczos3)
  55. } else {
  56. m = resize.Resize(480, 0, img, resize.Lanczos3)
  57. }
  58. //Crop out the center
  59. croppedImg, err := cutter.Crop(m, cutter.Config{
  60. Width: 480,
  61. Height: 480,
  62. Mode: cutter.Centered,
  63. })
  64. //Create the thumbnail
  65. out, err := fshAbs.Create(cacheFolder + filepath.Base(file) + ".jpg")
  66. if err != nil {
  67. return "", err
  68. }
  69. // write new image to file
  70. jpeg.Encode(out, croppedImg, nil)
  71. out.Close()
  72. if !generateOnly {
  73. //return the image as well
  74. ctx, err := getImageAsBase64(fsh, cacheFolder+filepath.Base(file)+".jpg")
  75. return ctx, err
  76. } else {
  77. return "", nil
  78. }
  79. }