mirror of
https://github.com/photoprism/photoprism.git
synced 2025-09-27 05:08:13 +08:00
205 lines
4.3 KiB
Go
205 lines
4.3 KiB
Go
package thumb
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/davidbyttow/govips/v2/vips"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/photoprism/photoprism/pkg/fs"
|
|
)
|
|
|
|
func TestVipsRotate(t *testing.T) {
|
|
if err := os.MkdirAll("testdata/vips/rotate", fs.ModeDir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Run("OrientationNormal", func(t *testing.T) {
|
|
src := "testdata/example.jpg"
|
|
dst := "testdata/vips/rotate/0.jpg"
|
|
|
|
assert.FileExists(t, src)
|
|
|
|
// Load image from file.
|
|
img, err := vips.NewImageFromFile(src)
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err = VipsRotate(img, OrientationNormal); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
params := vips.NewJpegExportParams()
|
|
imageBytes, _, exportErr := img.ExportJpeg(params)
|
|
|
|
if exportErr != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
// Write thumbnail to file.
|
|
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
assert.FileExists(t, dst)
|
|
})
|
|
t.Run("OrientationRotate90", func(t *testing.T) {
|
|
src := "testdata/example.jpg"
|
|
dst := "testdata/vips/rotate/90.jpg"
|
|
|
|
assert.FileExists(t, src)
|
|
|
|
// Load image from file.
|
|
img, err := vips.NewImageFromFile(src)
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err = VipsRotate(img, OrientationRotate90); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
params := vips.NewJpegExportParams()
|
|
imageBytes, _, exportErr := img.ExportJpeg(params)
|
|
|
|
if exportErr != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
// Write thumbnail to file.
|
|
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
assert.FileExists(t, dst)
|
|
})
|
|
t.Run("OrientationRotate180", func(t *testing.T) {
|
|
src := "testdata/example.jpg"
|
|
dst := "testdata/vips/rotate/180.jpg"
|
|
|
|
assert.FileExists(t, src)
|
|
|
|
// Load image from file.
|
|
img, err := vips.NewImageFromFile(src)
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err = VipsRotate(img, OrientationRotate180); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
params := vips.NewJpegExportParams()
|
|
imageBytes, _, exportErr := img.ExportJpeg(params)
|
|
|
|
if exportErr != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
// Write thumbnail to file.
|
|
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
assert.FileExists(t, dst)
|
|
})
|
|
t.Run("OrientationRotate270", func(t *testing.T) {
|
|
src := "testdata/example.jpg"
|
|
dst := "testdata/vips/rotate/270.jpg"
|
|
|
|
assert.FileExists(t, src)
|
|
|
|
// Load image from file.
|
|
img, err := vips.NewImageFromFile(src)
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err = VipsRotate(img, OrientationRotate270); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
params := vips.NewJpegExportParams()
|
|
imageBytes, _, exportErr := img.ExportJpeg(params)
|
|
|
|
if exportErr != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
// Write thumbnail to file.
|
|
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
|
|
t.Fatal(exportErr)
|
|
}
|
|
|
|
assert.FileExists(t, dst)
|
|
})
|
|
}
|
|
|
|
func TestVipsRotate_VariousAndInvalid(t *testing.T) {
|
|
// Ensure vips is initialized for image operations
|
|
VipsInit()
|
|
|
|
img, err := vips.LoadImageFromFile("testdata/example.jpg", VipsImportParams())
|
|
if err != nil {
|
|
t.Fatalf("load failed: %v", err)
|
|
}
|
|
defer img.Close()
|
|
|
|
// Valid operations should not return errors
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationFlipH))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationFlipV))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationRotate90))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationRotate180))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationRotate270))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationTranspose))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, OrientationTransverse))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Invalid orientation triggers debug branch but must not error
|
|
if c, err := img.Copy(); err == nil {
|
|
defer c.Close()
|
|
assert.NoError(t, VipsRotate(c, 999))
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
}
|