diff --git a/process.go b/process.go index 50c8ee8b..c1916ab8 100644 --- a/process.go +++ b/process.go @@ -497,11 +497,15 @@ func processImage(ctx context.Context) ([]byte, context.CancelFunc, error) { imgtype := getImageType(ctx) if po.Format == imageTypeUnknown { - if vipsTypeSupportSave[imgtype] { + if po.PreferWebP && vipsTypeSupportSave[imageTypeWEBP] { + po.Format = imageTypeWEBP + } else if vipsTypeSupportSave[imgtype] { po.Format = imgtype } else { po.Format = imageTypeJPEG } + } else if po.EnforceWebP && vipsTypeSupportSave[imageTypeWEBP] { + po.Format = imageTypeWEBP } if !vipsSupportSmartcrop { diff --git a/processing_options.go b/processing_options.go index 16696e64..cf8da05f 100644 --- a/processing_options.go +++ b/processing_options.go @@ -118,6 +118,9 @@ type processingOptions struct { Watermark watermarkOptions + PreferWebP bool + EnforceWebP bool + UsedPresets []string } @@ -605,11 +608,6 @@ func applyFormatOption(po *processingOptions, args []string) error { return fmt.Errorf("Invalid format arguments: %v", args) } - if conf.EnforceWebp && po.Format == imageTypeWEBP { - // Webp is enforced and already set as format - return nil - } - if f, ok := imageTypes[args[0]]; ok { po.Format = f } else { @@ -769,9 +767,11 @@ func defaultProcessingOptions(headers *processingHeaders) (*processingOptions, e UsedPresets: make([]string, 0, len(conf.Presets)), } - if (conf.EnableWebpDetection || conf.EnforceWebp) && strings.Contains(headers.Accept, "image/webp") { - po.Format = imageTypeWEBP + if strings.Contains(headers.Accept, "image/webp") { + po.PreferWebP = conf.EnableWebpDetection || conf.EnforceWebp + po.EnforceWebP = conf.EnforceWebp } + if conf.EnableClientHints && len(headers.ViewportWidth) > 0 { if vw, err := strconv.Atoi(headers.ViewportWidth); err == nil { po.Width = vw