Fix for blurry images from WEBP input and small output dimensions

master
Nils Juenemann 5 years ago
parent d0fb333ce4
commit c51a11f6d2

@ -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
)
// Reload input using shrink-on-load if shrink < 2 {
if imageType == JPEG && shrink >= 2 { return nil, 0, fmt.Errorf("only available for shrink >=2")
shrinkOnLoad := 1 }
// Recalculate integral shrink and double residual
switch { shrinkOnLoad := 1
case shrink >= 8: // Recalculate integral shrink and double residual
factor = factor / 8 switch {
shrinkOnLoad = 8 case shrink >= 8:
case shrink >= 4: factor = factor / 8
factor = factor / 4 shrinkOnLoad = 8
shrinkOnLoad = 4 case shrink >= 4:
case shrink >= 2: factor = factor / 4
factor = factor / 2 shrinkOnLoad = 4
shrinkOnLoad = 2 case shrink >= 2:
} factor = factor / 2
shrinkOnLoad = 2
}
// Reload input using shrink-on-load
switch imageType {
case JPEG:
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…
Cancel
Save