mirror of
https://github.com/talgo-cloud/bimg.git
synced 2026-03-16 02:45:54 -07:00
feat(#60): support zero top and left params in extract operation
This commit is contained in:
parent
89292e7ead
commit
b7eaa00f10
4 changed files with 26 additions and 1 deletions
5
image.go
5
image.go
|
|
@ -48,6 +48,11 @@ func (i *Image) Extract(top, left, width, height int) ([]byte, error) {
|
||||||
AreaWidth: width,
|
AreaWidth: width,
|
||||||
AreaHeight: height,
|
AreaHeight: height,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if top == 0 && left == 0 {
|
||||||
|
options.Top = -1
|
||||||
|
}
|
||||||
|
|
||||||
return i.Process(options)
|
return i.Process(options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,20 @@ func TestImageExtract(t *testing.T) {
|
||||||
Write("fixtures/test_extract_out.jpg", buf)
|
Write("fixtures/test_extract_out.jpg", buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestImageExtractZero(t *testing.T) {
|
||||||
|
buf, err := initImage("test.jpg").Extract(0, 0, 300, 200)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Cannot process the image: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = assertSize(buf, 300, 200)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
Write("fixtures/test_extract_zero_out.jpg", buf)
|
||||||
|
}
|
||||||
|
|
||||||
func TestImageEnlarge(t *testing.T) {
|
func TestImageEnlarge(t *testing.T) {
|
||||||
buf, err := initImage("test.png").Enlarge(500, 375)
|
buf, err := initImage("test.png").Enlarge(500, 375)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -229,7 +229,7 @@ func extractOrEmbedImage(image *C.VipsImage, o Options) (*C.VipsImage, error) {
|
||||||
left, top := (o.Width-inWidth)/2, (o.Height-inHeight)/2
|
left, top := (o.Width-inWidth)/2, (o.Height-inHeight)/2
|
||||||
image, err = vipsEmbed(image, left, top, o.Width, o.Height, o.Extend)
|
image, err = vipsEmbed(image, left, top, o.Width, o.Height, o.Extend)
|
||||||
break
|
break
|
||||||
case o.Top > 0 || o.Left > 0:
|
case o.Top != 0 || o.Left != 0:
|
||||||
if o.AreaWidth == 0 {
|
if o.AreaWidth == 0 {
|
||||||
o.AreaHeight = o.Width
|
o.AreaHeight = o.Width
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
vips.go
6
vips.go
|
|
@ -8,6 +8,7 @@ import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -340,6 +341,10 @@ func vipsSave(image *C.VipsImage, o vipsSaveOptions) ([]byte, error) {
|
||||||
return buf, nil
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func max(x int) int {
|
||||||
|
return int(math.Max(float64(x), 0))
|
||||||
|
}
|
||||||
|
|
||||||
func vipsExtract(image *C.VipsImage, left, top, width, height int) (*C.VipsImage, error) {
|
func vipsExtract(image *C.VipsImage, left, top, width, height int) (*C.VipsImage, error) {
|
||||||
var buf *C.VipsImage
|
var buf *C.VipsImage
|
||||||
defer C.g_object_unref(C.gpointer(image))
|
defer C.g_object_unref(C.gpointer(image))
|
||||||
|
|
@ -348,6 +353,7 @@ func vipsExtract(image *C.VipsImage, left, top, width, height int) (*C.VipsImage
|
||||||
return nil, errors.New("Maximum image size exceeded")
|
return nil, errors.New("Maximum image size exceeded")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
top, left = max(top), max(left)
|
||||||
err := C.vips_extract_area_bridge(image, &buf, C.int(left), C.int(top), C.int(width), C.int(height))
|
err := C.vips_extract_area_bridge(image, &buf, C.int(left), C.int(top), C.int(width), C.int(height))
|
||||||
if err != 0 {
|
if err != 0 {
|
||||||
return nil, catchVipsError()
|
return nil, catchVipsError()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue