Browse Source

Add image flip step

feature/add-image-processing
Roman Zipp 3 years ago
parent
commit
a649cb2bc4
  1. 6
      config/example.json
  2. 24
      pipelines/executable_step.go
  3. 84
      pipelines/pipeline_test.go
  4. 8
      pipelines/step.go

6
config/example.json

@ -21,8 +21,12 @@
} }
}, },
{ {
"name": "grayscale",
"name": "flip image",
"type": 2 "type": 2
},
{
"name": "grayscale",
"type": 3
} }
], ],
"output": { "output": {

24
pipelines/executable_step.go

@ -1,6 +1,8 @@
package pipelines package pipelines
import ( import (
"errors"
"fmt"
"github.com/disintegration/imaging" "github.com/disintegration/imaging"
"image" "image"
) )
@ -39,6 +41,28 @@ func (s RotateImageStep) Execute(src image.Image) (image.Image, error) {
return src, nil return src, nil
} }
// Flip image
type FlipImageStep struct {
Step
Options struct {
Direction string `json:"direction"`
} `json:"options"`
}
func (s FlipImageStep) Execute(src image.Image) (image.Image, error) {
switch s.Options.Direction {
case "h":
src = imaging.FlipH(src)
case "v":
src = imaging.FlipH(src)
default:
return src, errors.New(fmt.Sprintf("invalid flip direction: %s", s.Options.Direction))
}
return src, nil
}
// Grayscale image // Grayscale image
type GrayscaleImageStep struct { type GrayscaleImageStep struct {

84
pipelines/pipeline_test.go

@ -190,6 +190,88 @@ func TestExecuteSteps(t *testing.T) {
os.Remove(storageProvider.GetPath(Bucket, dest)) os.Remove(storageProvider.GetPath(Bucket, dest))
}) })
t.Run("Image flip step is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_06"
const Payload string = `{
"name": "example pipeline",
"type": 1,
"removeMetadata": false,
"steps": [
{
"name": "flip image",
"type": 2,
"options": {
"direction": "h"
}
}
]
}`
wd, _ := os.Getwd()
pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
storageProvider := storage.GetFileSystemStorageProvider("test", "..")
// copy test file to storage bucket
_, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/800x500.jpg"))
assert.Nil(t, err, "Test file should be readable")
assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
// run pipeline steps
dest, err := pipe.Run("source.jpg", Bucket, storageProvider)
assert.Nil(t, err)
assert.FileExists(t, storageProvider.GetPath(Bucket, dest))
// read image config
file, err := storageProvider.OpenFile(Bucket, dest)
assert.Nil(t, err)
imgConf, _, err := image.DecodeConfig(file)
assert.Nil(t, err)
assert.Equal(t, 800, imgConf.Width)
assert.Equal(t, 500, imgConf.Height)
// clean up
os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
os.Remove(storageProvider.GetPath(Bucket, dest))
})
t.Run("Image flip step direction validation is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_06"
const Payload string = `{
"name": "example pipeline",
"type": 1,
"removeMetadata": false,
"steps": [
{
"name": "flip image",
"type": 2,
"options": {
"direction": "f"
}
}
]
}`
wd, _ := os.Getwd()
pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
storageProvider := storage.GetFileSystemStorageProvider("test", "..")
// copy test file to storage bucket
_, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/800x500.jpg"))
assert.Nil(t, err, "Test file should be readable")
assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
// run pipeline steps
_, err = pipe.Run("source.jpg", Bucket, storageProvider)
assert.EqualError(t, err, "invalid flip direction: f")
// clean up
os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
})
t.Run("Image grayscale step is successful", func(t *testing.T) { t.Run("Image grayscale step is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_05" const Bucket string = "pipeline_test_05"
const Payload string = `{ const Payload string = `{
@ -199,7 +281,7 @@ func TestExecuteSteps(t *testing.T) {
"steps": [ "steps": [
{ {
"name": "grayscale", "name": "grayscale",
"type": 2
"type": 3
} }
] ]
}` }`

8
pipelines/step.go

@ -10,6 +10,7 @@ type StepType int
const ( const (
TypeResizeImageStep StepType = iota TypeResizeImageStep StepType = iota
TypeRotateImageStep TypeRotateImageStep
TypeFlipImageStep
TypeGrayscaleImageStep TypeGrayscaleImageStep
) )
@ -36,6 +37,13 @@ func (s Step) GetExecutable() (IExecutableStep, error) {
} }
return step, nil return step, nil
case TypeFlipImageStep:
step := FlipImageStep{}
if err := json.Unmarshal(s.Options, &step.Options); err != nil {
return nil, err
}
return step, nil
case TypeGrayscaleImageStep: case TypeGrayscaleImageStep:
return GrayscaleImageStep{}, nil return GrayscaleImageStep{}, nil
} }

Loading…
Cancel
Save