mirror of
https://github.com/talgo-cloud/bimg.git
synced 2026-03-14 09:55:56 -07:00
Fix for blurry images from WEBP input and small output dimensions
This commit is contained in:
parent
d0fb333ce4
commit
c51a11f6d2
1 changed files with 28 additions and 20 deletions
48
resizer.go
48
resizer.go
|
|
@ -69,6 +69,7 @@ func resizer(buf []byte, o Options) ([]byte, error) {
|
||||||
shrink := calculateShrink(factor, o.Interpolator)
|
shrink := calculateShrink(factor, o.Interpolator)
|
||||||
residual := calculateResidual(factor, shrink)
|
residual := calculateResidual(factor, shrink)
|
||||||
|
|
||||||
|
fmt.Printf("size=%vx%v, factor=%v, shrink=%v, residual=%v, opts=%+v\n", inWidth, inHeight, factor, shrink, residual, o)
|
||||||
// Do not enlarge the output if the input width or height
|
// Do not enlarge the output if the input width or height
|
||||||
// are already less than the required dimensions
|
// are already less than the required dimensions
|
||||||
if !o.Enlarge && !o.Force {
|
if !o.Enlarge && !o.Force {
|
||||||
|
|
@ -449,29 +450,36 @@ func shrinkImage(image *C.VipsImage, o Options, residual float64, shrink int) (*
|
||||||
}
|
}
|
||||||
|
|
||||||
func shrinkOnLoad(buf []byte, input *C.VipsImage, imageType ImageType, factor float64, shrink int) (*C.VipsImage, float64, error) {
|
func shrinkOnLoad(buf []byte, input *C.VipsImage, imageType ImageType, factor float64, shrink int) (*C.VipsImage, float64, error) {
|
||||||
var image *C.VipsImage
|
var (
|
||||||
var err error
|
image *C.VipsImage
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
if shrink < 2 {
|
||||||
|
return nil, 0, fmt.Errorf("only available for shrink >=2")
|
||||||
|
}
|
||||||
|
|
||||||
|
shrinkOnLoad := 1
|
||||||
|
// Recalculate integral shrink and double residual
|
||||||
|
switch {
|
||||||
|
case shrink >= 8:
|
||||||
|
factor = factor / 8
|
||||||
|
shrinkOnLoad = 8
|
||||||
|
case shrink >= 4:
|
||||||
|
factor = factor / 4
|
||||||
|
shrinkOnLoad = 4
|
||||||
|
case shrink >= 2:
|
||||||
|
factor = factor / 2
|
||||||
|
shrinkOnLoad = 2
|
||||||
|
}
|
||||||
|
|
||||||
// Reload input using shrink-on-load
|
// Reload input using shrink-on-load
|
||||||
if imageType == JPEG && shrink >= 2 {
|
switch imageType {
|
||||||
shrinkOnLoad := 1
|
case JPEG:
|
||||||
// Recalculate integral shrink and double residual
|
|
||||||
switch {
|
|
||||||
case shrink >= 8:
|
|
||||||
factor = factor / 8
|
|
||||||
shrinkOnLoad = 8
|
|
||||||
case shrink >= 4:
|
|
||||||
factor = factor / 4
|
|
||||||
shrinkOnLoad = 4
|
|
||||||
case shrink >= 2:
|
|
||||||
factor = factor / 2
|
|
||||||
shrinkOnLoad = 2
|
|
||||||
}
|
|
||||||
|
|
||||||
image, err = vipsShrinkJpeg(buf, input, shrinkOnLoad)
|
image, err = vipsShrinkJpeg(buf, input, shrinkOnLoad)
|
||||||
} else if imageType == WEBP {
|
case WEBP:
|
||||||
image, err = vipsShrinkWebp(buf, input, shrink)
|
image, err = vipsShrinkWebp(buf, input, shrinkOnLoad)
|
||||||
} else {
|
default:
|
||||||
return nil, 0, fmt.Errorf("%v doesn't support shrink on load", ImageTypeName(imageType))
|
return nil, 0, fmt.Errorf("%v doesn't support shrink on load", ImageTypeName(imageType))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue