mirror of
https://github.com/talgo-cloud/bimg.git
synced 2026-03-11 00:10:27 -07:00
Merge pull request #156 from Dynom/SmartCropToGravity
Replacing SmartCrop with a Gravity option
This commit is contained in:
commit
93ce8ef143
5 changed files with 69 additions and 18 deletions
8
image.go
8
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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
Write("fixtures/test_smart_crop.jpg", buf)
|
||||
if !(VipsMajorVersion >= 8 && VipsMinorVersion > 4) {
|
||||
t.Skipf("Skipping this test, libvips doesn't meet version requirement %s > 8.4", VipsVersion)
|
||||
}
|
||||
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue