diff --git a/image.go b/image.go index 6f925fb..efaffcb 100644 --- a/image.go +++ b/image.go @@ -44,10 +44,10 @@ func (i *Image) ResizeAndCrop(width, height int) ([]byte, error) { // SmartCrop produces a thumbnail aiming at focus on the interesting part. func (i *Image) SmartCrop(width, height int) ([]byte, error) { options := Options{ - Width: width, - Height: height, - Crop: true, - SmartCrop: true, + Width: width, + Height: height, + Crop: true, + Gravity: GravitySmart, } return i.Process(options) } diff --git a/image_test.go b/image_test.go index 5428957..96fc4ad 100644 --- a/image_test.go +++ b/image_test.go @@ -456,20 +456,23 @@ func TestFluentInterface(t *testing.T) { } func TestImageSmartCrop(t *testing.T) { - if VipsMajorVersion >= 8 && VipsMinorVersion > 4 { - i := initImage("northern_cardinal_bird.jpg") - buf, err := i.SmartCrop(300, 300) - if err != nil { - t.Errorf("Cannot process the image: %#v", err) - } - err = assertSize(buf, 300, 300) - if err != nil { - t.Error(err) - } + if !(VipsMajorVersion >= 8 && VipsMinorVersion > 4) { + t.Skipf("Skipping this test, libvips doesn't meet version requirement %s > 8.4", VipsVersion) + } - Write("fixtures/test_smart_crop.jpg", buf) + i := initImage("northern_cardinal_bird.jpg") + buf, err := i.SmartCrop(300, 300) + if err != nil { + t.Errorf("Cannot process the image: %#v", err) + } + + err = assertSize(buf, 300, 300) + if err != nil { + t.Error(err) } + + Write("fixtures/test_smart_crop.jpg", buf) } func initImage(file string) *Image { diff --git a/options.go b/options.go index b8d8a08..f6ebec2 100644 --- a/options.go +++ b/options.go @@ -27,6 +27,8 @@ const ( GravitySouth // GravityWest represents the west value used for image gravity orientation. GravityWest + // GravitySmart enables libvips Smart Crop algorithm for image gravity orientation. + GravitySmart ) // Interpolator represents the image interpolation value. @@ -193,7 +195,7 @@ type Options struct { Compression int Zoom int Crop bool - SmartCrop bool + SmartCrop bool // Deprecated Enlarge bool Embed bool Flip bool diff --git a/resize.go b/resize.go index fa91908..93d6248 100644 --- a/resize.go +++ b/resize.go @@ -249,7 +249,7 @@ func extractOrEmbedImage(image *C.VipsImage, o Options) (*C.VipsImage, error) { inHeight := int(image.Ysize) switch { - case o.SmartCrop: + case o.Gravity == GravitySmart, o.SmartCrop: image, err = vipsSmartCrop(image, o.Width, o.Height) break case o.Crop: diff --git a/resize_test.go b/resize_test.go index c5995f7..28e3109 100644 --- a/resize_test.go +++ b/resize_test.go @@ -2,6 +2,7 @@ package bimg import ( "bytes" + "crypto/md5" "image" "image/jpeg" "io/ioutil" @@ -392,6 +393,51 @@ func TestResizePngWithTransparency(t *testing.T) { Write("fixtures/transparent_out.png", newImg) } +func TestIfBothSmartCropOptionsAreIdentical(t *testing.T) { + if !(VipsMajorVersion >= 8 && VipsMinorVersion > 4) { + t.Skipf("Skipping this test, libvips doesn't meet version requirement %s > 8.4", VipsVersion) + } + + benchmarkOptions := Options{Width: 100, Height: 100, Crop: true} + smartCropOptions := Options{Width: 100, Height: 100, Crop: true, SmartCrop: true} + gravityOptions := Options{Width: 100, Height: 100, Crop: true, Gravity: GravitySmart} + + testImg, err := os.Open("fixtures/northern_cardinal_bird.jpg") + if err != nil { + t.Fatal(err) + } + defer testImg.Close() + + testImgByte, err := ioutil.ReadAll(testImg) + if err != nil { + t.Fatal(err) + } + + scImg, err := Resize(testImgByte, smartCropOptions) + if err != nil { + t.Fatal(err) + } + + gImg, err := Resize(testImgByte, gravityOptions) + if err != nil { + t.Fatal(err) + } + + benchmarkImg, err := Resize(testImgByte, benchmarkOptions) + if err != nil { + t.Fatal(err) + } + + sch, gh, bh := md5.Sum(scImg), md5.Sum(gImg), md5.Sum(benchmarkImg) + if gh == bh || sch == bh { + t.Error("Expected both options produce a different result from a standard crop.") + } + + if sch != gh { + t.Errorf("Expected both options to result in the same output, %x != %x", sch, gh) + } +} + func runBenchmarkResize(file string, o Options, b *testing.B) { buf, _ := Read(path.Join("fixtures", file))