Micro-service for file storage and processing written in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.1 KiB

  1. package pipelines
  2. import (
  3. "errors"
  4. "fmt"
  5. "image"
  6. "github.com/disintegration/imaging"
  7. )
  8. type IExecutableStep interface {
  9. Execute(src image.Image) (image.Image, error)
  10. }
  11. // Resize image
  12. type ResizeImageStep struct {
  13. Step
  14. Options struct {
  15. Width int `json:"width"`
  16. Height int `json:"height"`
  17. Upscale bool `json:"upscale"`
  18. } `json:"options"`
  19. }
  20. func (s ResizeImageStep) Execute(src image.Image) (image.Image, error) {
  21. src = imaging.Resize(src, s.Options.Width, s.Options.Height, imaging.Linear)
  22. return src, nil
  23. }
  24. // Rotate image
  25. type RotateImageStep struct {
  26. Step
  27. Options struct {
  28. Angle float64 `json:"angle"`
  29. } `json:"options"`
  30. }
  31. func (s RotateImageStep) Execute(src image.Image) (image.Image, error) {
  32. src = imaging.Rotate(src, s.Options.Angle, image.Black)
  33. return src, nil
  34. }
  35. // Flip image
  36. type FlipImageStep struct {
  37. Step
  38. Options struct {
  39. Direction string `json:"direction"`
  40. } `json:"options"`
  41. }
  42. func (s FlipImageStep) Execute(src image.Image) (image.Image, error) {
  43. switch s.Options.Direction {
  44. case "h":
  45. src = imaging.FlipH(src)
  46. case "v":
  47. src = imaging.FlipH(src)
  48. default:
  49. return src, errors.New(fmt.Sprintf("invalid flip direction: %s", s.Options.Direction))
  50. }
  51. return src, nil
  52. }
  53. // Grayscale image
  54. type GrayscaleImageStep struct {
  55. Step
  56. }
  57. func (s GrayscaleImageStep) Execute(src image.Image) (image.Image, error) {
  58. src = imaging.Grayscale(src)
  59. return src, nil
  60. }
  61. // Fit image
  62. type FitImageStep struct {
  63. Step
  64. Options struct {
  65. Height int `json:"height"`
  66. Width int `json:"width"`
  67. } `json:"options"`
  68. }
  69. func (s FitImageStep) Execute(src image.Image) (image.Image, error) {
  70. src = imaging.Fit(src, s.Options.Width, s.Options.Height, imaging.Lanczos)
  71. return src, nil
  72. }
  73. // Invert image
  74. type InvertImageStep struct {
  75. Step
  76. }
  77. func (s InvertImageStep) Execute(src image.Image) (image.Image, error) {
  78. src = imaging.Invert(src)
  79. return src, nil
  80. }
  81. // Blur image
  82. type BlurImageStep struct {
  83. Step
  84. Options struct {
  85. Sigma float64 `json:"sigma"`
  86. } `json:"options"`
  87. }
  88. func (s BlurImageStep) Execute(src image.Image) (image.Image, error) {
  89. src = imaging.Blur(src, s.Options.Sigma)
  90. return src, nil
  91. }