Browse Source

Merge commit '25d14667db25f72388b3fa80a9d4bdeffdabc9ac' into HEAD

feature/update-route-registration
Jenkins 3 years ago
committed by Fabian Vowie
parent
commit
097ba1d683
No known key found for this signature in database GPG Key ID: C27317C33B27C410
  1. 43
      README.md
  2. 40
      pipelines/executable_step.go
  3. 141
      pipelines/pipeline_test.go
  4. 20
      pipelines/step.go

43
README.md

@ -232,6 +232,49 @@ Convert the colorspace of an image into grayscale.
} }
``` ```
#### Fit
Scales down the image to fit the specified maximum width and height.
**Step definition**:
```json
{
"type": 4,
"options": {
"height": 300,
"width": 200
}
}
```
#### Invert
Invert image colors.
**Step definition**:
```json
{
"type": 5
}
```
#### Blur
Blur image using Gaussian functions.
**Step definition**:
```json
{
"type": 6,
"options": {
"sigma": 50.0
}
}
```
## Authors ## Authors
- [Fabian Vowie](https://gogs.informatik.hs-fulda.de/FabianVowie) - [Fabian Vowie](https://gogs.informatik.hs-fulda.de/FabianVowie)

40
pipelines/executable_step.go

@ -74,3 +74,43 @@ func (s GrayscaleImageStep) Execute(src image.Image) (image.Image, error) {
src = imaging.Grayscale(src) src = imaging.Grayscale(src)
return src, nil return src, nil
} }
// Fit image
type FitImageStep struct {
Step
Options struct {
Height int `json:"height"`
Width int `json:"width"`
} `json:"options"`
}
func (s FitImageStep) Execute(src image.Image) (image.Image, error) {
src = imaging.Fit(src, s.Options.Width, s.Options.Height, imaging.Lanczos)
return src, nil
}
// Invert image
type InvertImageStep struct {
Step
}
func (s InvertImageStep) Execute(src image.Image) (image.Image, error) {
src = imaging.Invert(src)
return src, nil
}
// Blur image
type BlurImageStep struct {
Step
Options struct {
Sigma float64 `json:"sigma"`
} `json:"options"`
}
func (s BlurImageStep) Execute(src image.Image) (image.Image, error) {
src = imaging.Blur(src, s.Options.Sigma)
return src, nil
}

141
pipelines/pipeline_test.go

@ -239,7 +239,7 @@ func TestExecuteSteps(t *testing.T) {
}) })
t.Run("Image flip step direction validation is successful", func(t *testing.T) { t.Run("Image flip step direction validation is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_06"
const Bucket string = "pipeline_test_07"
const Payload string = `{ const Payload string = `{
"name": "example pipeline", "name": "example pipeline",
"type": 1, "type": 1,
@ -316,6 +316,145 @@ func TestExecuteSteps(t *testing.T) {
os.Remove(storageProvider.GetPath(Bucket, "source.jpg")) os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
os.Remove(storageProvider.GetPath(Bucket, dest)) os.Remove(storageProvider.GetPath(Bucket, dest))
}) })
t.Run("Image fit step is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_08"
const Payload string = `{
"name": "example pipeline",
"type": 1,
"removeMetadata": false,
"steps": [
{
"name": "fit",
"type": 4,
"options": {
"width": 300,
"height": 200
}
}
]
}`
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/900x900.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, 200, imgConf.Width)
assert.Equal(t, 200, imgConf.Height)
// clean up
os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
os.Remove(storageProvider.GetPath(Bucket, dest))
})
t.Run("Image invert step is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_09"
const Payload string = `{
"name": "example pipeline",
"type": 1,
"removeMetadata": false,
"steps": [
{
"name": "invert",
"type": 5
}
]
}`
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/900x900.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, 900, imgConf.Width)
assert.Equal(t, 900, imgConf.Height)
// clean up
os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
os.Remove(storageProvider.GetPath(Bucket, dest))
})
t.Run("Image blur step is successful", func(t *testing.T) {
const Bucket string = "pipeline_test_10"
const Payload string = `{
"name": "example pipeline",
"type": 1,
"removeMetadata": false,
"steps": [
{
"name": "blur",
"type": 6,
"options": {
"sigma": 50.0
}
}
]
}`
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/900x900.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, 900, imgConf.Width)
assert.Equal(t, 900, imgConf.Height)
// clean up
os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
os.Remove(storageProvider.GetPath(Bucket, dest))
})
} }
// output options // output options

20
pipelines/step.go

@ -12,6 +12,9 @@ const (
TypeRotateImageStep TypeRotateImageStep
TypeFlipImageStep TypeFlipImageStep
TypeGrayscaleImageStep TypeGrayscaleImageStep
TypeFitImageStep
TypeInvertImageStep
TypeBlurImageStep
) )
type Step struct { type Step struct {
@ -44,8 +47,25 @@ func (s Step) GetExecutable() (IExecutableStep, error) {
} }
return step, nil return step, nil
case TypeFitImageStep:
step := FitImageStep{}
if err := json.Unmarshal(s.Options, &step.Options); err != nil {
return nil, err
}
return step, nil
case TypeInvertImageStep:
return InvertImageStep{}, nil
case TypeGrayscaleImageStep: case TypeGrayscaleImageStep:
return GrayscaleImageStep{}, nil return GrayscaleImageStep{}, nil
case TypeBlurImageStep:
step := BlurImageStep{}
if err := json.Unmarshal(s.Options, &step.Options); err != nil {
return nil, err
}
return step, nil
} }
return nil, errors.New("invalid type") return nil, errors.New("invalid type")

Loading…
Cancel
Save