From c6ae33c61d34d702584f532c50962023394697f5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 29 Dec 2025 17:00:49 +0100 Subject: [PATCH] images: Add compression option to image config and clean up some of the options handling The original idea of setting quality to 0 for lossless WebP was didn't allow a setting that made sense for both JPEG and WebP. Note that the above didn't really work at all, so this should not break anything. --- internal/warpc/genwebp/webp.c | 15 +++-- internal/warpc/warpc.go | 6 +- internal/warpc/wasm/webp.wasm | Bin 686101 -> 686191 bytes internal/warpc/webp.go | 31 ++------- resources/images/codec.go | 40 ++++------- resources/images/config.go | 42 ++++++++---- resources/images/config_test.go | 1 - resources/images/image.go | 9 +-- .../images/images_golden_integration_test.go | 62 ++++++++++++++---- .../losslessvsquality/resize-300x300-jpeg.jpg | Bin 0 -> 12148 bytes .../resize-300x300-webp-lossy.webp | Bin 0 -> 7284 bytes .../resize-300x300-webp.webp} | Bin .../webp/resize-300x300-webp-lossless.webp | Bin 0 -> 60736 bytes 13 files changed, 115 insertions(+), 91 deletions(-) create mode 100644 resources/images/testdata/images_golden/losslessvsquality/resize-300x300-jpeg.jpg create mode 100644 resources/images/testdata/images_golden/losslessvsquality/resize-300x300-webp-lossy.webp rename resources/images/testdata/images_golden/{process/webp/resize-300x300-webp-q0.webp => losslessvsquality/resize-300x300-webp.webp} (100%) create mode 100644 resources/images/testdata/images_golden/process/webp/resize-300x300-webp-lossless.webp diff --git a/internal/warpc/genwebp/webp.c b/internal/warpc/genwebp/webp.c index 79dff6201..2a51fa07f 100644 --- a/internal/warpc/genwebp/webp.c +++ b/internal/warpc/genwebp/webp.c @@ -73,9 +73,10 @@ typedef struct typedef struct { - float quality; // between 0 and 100. Set to 0 for lossless. - char hint[64]; // drawing, icon, photo, picture, or text. Default is photo. - int preset; // preset to use; resolved from hint. + float quality; // between 1 and 100. + char compression[32]; // "lossy" or "lossless" + char hint[64]; // drawing, icon, photo, picture, or text. Default is photo. + int preset; // preset to use; resolved from hint. bool useSharpYuv; // use sharp YUV for better quality. @@ -302,7 +303,7 @@ static uint8_t initEncoderConfig(WebPConfig *config, InputOptions opts) return 0; } - if (opts.quality == 0) + if (strcmp(opts.compression, "lossless") == 0) { // Activate the lossless compression mode with the desired efficiency level // between 0 (fastest, lowest compression) and 9 (slower, best compression). @@ -396,6 +397,12 @@ InputMessage parse_input_message(const char *line) if (options_object != NULL) { msg.data.options.quality = (int)json_object_get_number(options_object, "quality"); + const char *compression_str = json_object_get_string(options_object, "compression"); + if (compression_str != NULL) + { + strncpy(msg.data.options.compression, compression_str, sizeof(msg.data.options.compression) - 1); + msg.data.options.compression[sizeof(msg.data.options.compression) - 1] = '\0'; + } const char *hint_str = json_object_get_string(options_object, "hint"); if (hint_str != NULL) { diff --git a/internal/warpc/warpc.go b/internal/warpc/warpc.go index c3bcca53c..5f9797de1 100644 --- a/internal/warpc/warpc.go +++ b/internal/warpc/warpc.go @@ -792,11 +792,9 @@ func (d *Dispatchers) Webp() (Dispatcher[WebpInput, WebpOutput], error) { return d.webp.start() } -func (d *Dispatchers) NewWepCodec(quality int, hint string) (*WebpCodec, error) { +func (d *Dispatchers) NewWepCodec() (*WebpCodec, error) { return &WebpCodec{ - d: d.Webp, - quality: quality, - hint: hint, + d: d.Webp, }, nil } diff --git a/internal/warpc/wasm/webp.wasm b/internal/warpc/wasm/webp.wasm index c99ae17cf78e98517e54ee601179f152fa2442df..14c4ff841ca053e062ab48eb87ed1826692e51ec 100755 GIT binary patch delta 32418 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 1<<16 || b.Dy() >= 1<<16 { return errors.New("webp: image is too large to encode") @@ -298,24 +293,8 @@ func (d *WebpCodec) EncodeOptions(w io.Writer, img image.Image, options map[stri return fmt.Errorf("no image bytes extracted from %T", img) } - // Commands: - // encodeNRGBA - // encodeGray - // decode - // config - - opts := map[string]any{ - "quality": d.quality, // a number between 0 and 100. Set to 0 for lossless. - "hint": d.hint, // drawing, icon, photo, picture, or text - "useSharpYuv": true, // Use sharp (and slow) RGB->YUV conversion. - } - - // Override with per-image options if provided. - for _, key := range []string{"quality", "hint"} { - if v, ok := options[key]; ok { - opts[key] = v - } - } + opts = maps.Clone(opts) + opts["useSharpYuv"] = true // Use sharp (and slow) RGB->YUV conversion. message := Message[WebpInput]{ Header: Header{ diff --git a/resources/images/codec.go b/resources/images/codec.go index 087643c26..b36c1b15b 100644 --- a/resources/images/codec.go +++ b/resources/images/codec.go @@ -37,35 +37,27 @@ type Decoder interface { DecodeConfig(r io.Reader) (image.Config, error) } -// Encoder defines the encoding of an image format. -type Encoder interface { - Encode(w io.Writer, src image.Image) error -} - type ToEncoder interface { EncodeTo(conf ImageConfig, w io.Writer, src image.Image) error } -// EncoderWithOptions defines the encoding of an image format with options. -// This is currently only used for WebP and the options are passed as a map -// to match the internal WASM API. The options map may be nil when no options -// need to be overridden. -type EncoderWithOptions interface { - EncodeOptions(w io.Writer, src image.Image, options map[string]any) error +// EncoderWithOptions defines the encoding of an image format with the given options. +type Encoder interface { + Encode(w io.Writer, src image.Image, options map[string]any) error } -// CodecStdlib defines both decoding and encoding of an image format as defined by the standard library. -type CodecStdlib interface { +// EncodeDecoder defines both decoding and encoding of an image format as defined by the standard library. +type EncodeDecoder interface { Decoder Encoder } // Codec is a generic image codec supporting multiple formats. type Codec struct { - webp CodecStdlib + webp EncodeDecoder } -func newCodec(webp CodecStdlib) *Codec { +func newCodec(webp EncodeDecoder) *Codec { return &Codec{webp: webp} } @@ -131,20 +123,12 @@ func (d *Codec) EncodeTo(conf ImageConfig, w io.Writer, img image.Image) error { case BMP: return bmp.Encode(w, img) case WEBP: - if enc, ok := d.webp.(EncoderWithOptions); ok { - var opts map[string]any - if conf.qualitySetForImage || conf.hintSetForImage { - opts = make(map[string]any) - if conf.qualitySetForImage { - opts["quality"] = conf.Quality - } - if conf.hintSetForImage { - opts["hint"] = conf.Hint - } - } - return enc.EncodeOptions(w, img, opts) + opts := map[string]any{ + "compression": conf.Compression, + "quality": conf.Quality, + "hint": conf.Hint, } - return d.webp.Encode(w, img) + return d.webp.Encode(w, img, opts) default: return errors.New("format not supported") } diff --git a/resources/images/config.go b/resources/images/config.go index 32940021c..788d9c7b6 100644 --- a/resources/images/config.go +++ b/resources/images/config.go @@ -85,6 +85,11 @@ var anchorPositions = map[string]gift.Anchor{ smartCropIdentifier: SmartCropAnchor, } +var compressionMethods = map[string]bool{ + "lossy": true, + "lossless": true, +} + // These encoding hints are currently only relevant for Webp. var hints = map[string]bool{ "picture": true, @@ -127,6 +132,7 @@ const ( defaultResampleFilter = "box" defaultBgColor = "#ffffff" defaultHint = "photo" + defaultCompression = "lossy" ) var ( @@ -135,6 +141,7 @@ var ( "bgColor": defaultBgColor, "hint": defaultHint, "quality": defaultJPEGQuality, + "compression": defaultCompression, } defaultImageConfig *config.ConfigNamespace[ImagingConfig, ImagingConfigInternal] @@ -226,7 +233,8 @@ func DecodeImageConfig(options []string, defaults *config.ConfigNamespace[Imagin c.Filter = filter } else if _, ok := hints[part]; ok { c.Hint = part - c.hintSetForImage = true + } else if _, ok := compressionMethods[part]; ok { + c.Compression = part } else if part[0] == '#' { c.BgColor, err = hexStringToColorGo(part[1:]) if err != nil { @@ -237,10 +245,9 @@ func DecodeImageConfig(options []string, defaults *config.ConfigNamespace[Imagin if err != nil { return c, err } - if c.Quality < 0 || c.Quality > 100 { - return c, errors.New("quality ranges from 0 to 100 inclusive") + if c.Quality < 1 || c.Quality > 100 { + return c, errors.New("quality ranges from 1 to 100 inclusive") } - c.qualitySetForImage = true } else if part[0] == 'r' { c.Rotate, err = strconv.Atoi(part[1:]) if err != nil { @@ -306,12 +313,16 @@ func DecodeImageConfig(options []string, defaults *config.ConfigNamespace[Imagin c.TargetFormat = sourceFormat } - if !c.qualitySetForImage && c.Quality <= 0 && c.TargetFormat.RequiresDefaultQuality() { + if c.Quality <= 0 && c.TargetFormat.RequiresDefaultQuality() { // We need a quality setting for all JPEGs and WEBPs, - // unless the user explicitly set quality (e.g., q0 for lossless WebP). + // unless the user explicitly set quality. c.Quality = defaults.Config.Imaging.Quality } + if c.Compression == "" { + c.Compression = defaults.Config.Imaging.Compression + } + if c.BgColor == nil && c.TargetFormat != sourceFormat { if sourceFormat.SupportsTransparency() && !c.TargetFormat.SupportsTransparency() { c.BgColor = defaults.Config.BgColor @@ -341,11 +352,11 @@ type ImageConfig struct { // If set, this will be used as the key in filenames etc. Key string - // Quality ranges from 1 to 100 inclusive, higher is better. + // Quality ranges from 0 to 100 inclusive, higher is better. // This is only relevant for JPEG and WEBP images. + // For WebP, 0 means lossless. // Default is 75. - Quality int - qualitySetForImage bool // Whether the above is set for this image. + Quality int // Rotate rotates an image by the given angle counter-clockwise. // The rotation will be performed first. @@ -360,8 +371,9 @@ type ImageConfig struct { // Hint about what type of picture this is. Used to optimize encoding // when target is set to webp. - Hint string - hintSetForImage bool // Whether the above is set for this image. + Hint string + + Compression string Width int Height int @@ -415,6 +427,11 @@ type ImagingConfig struct { // Default image quality setting (1-100). Only used for JPEG and WebP images. Quality int + // Compression method to use. + // One of "lossy" or "lossless". + // Note that lossless is currently only supported for WebP. + Compression string + // Resample filter to use in resize operations. ResampleFilter string @@ -434,7 +451,7 @@ type ImagingConfig struct { } func (cfg *ImagingConfig) init() error { - if cfg.Quality < 0 || cfg.Quality > 100 { + if cfg.Quality < 1 || cfg.Quality > 100 { return errors.New("image quality must be a number between 1 and 100") } @@ -442,6 +459,7 @@ func (cfg *ImagingConfig) init() error { cfg.Anchor = strings.ToLower(cfg.Anchor) cfg.ResampleFilter = strings.ToLower(cfg.ResampleFilter) cfg.Hint = strings.ToLower(cfg.Hint) + cfg.Compression = strings.ToLower(cfg.Compression) if cfg.Anchor == "" { cfg.Anchor = smartCropIdentifier diff --git a/resources/images/config_test.go b/resources/images/config_test.go index 907bb10cb..ba4c7e158 100644 --- a/resources/images/config_test.go +++ b/resources/images/config_test.go @@ -133,7 +133,6 @@ func newImageConfig(action string, width, height, quality, rotate int, filter, a c.Width = width c.Height = height c.Quality = quality - c.qualitySetForImage = quality != 75 c.Rotate = rotate c.BgColor, _ = hexStringToColorGo(bgColor) c.Anchor = SmartCropAnchor diff --git a/resources/images/image.go b/resources/images/image.go index 4d8f4961c..ba518841a 100644 --- a/resources/images/image.go +++ b/resources/images/image.go @@ -137,7 +137,7 @@ func NewImageProcessor(warnl logg.LevelLogger, wasmDispatchers *warpc.Dispatcher return nil, err } - webpCodec, err := wasmDispatchers.NewWepCodec(cfg.Config.Imaging.Quality, cfg.Config.Imaging.Hint) + webpCodec, err := wasmDispatchers.NewWepCodec() if err != nil { return nil, err } @@ -300,9 +300,10 @@ func GetDefaultImageConfig(defaults *config.ConfigNamespace[ImagingConfig, Imagi defaults = defaultImageConfig } return ImageConfig{ - Anchor: -1, // The real values start at 0. - Hint: "photo", - Quality: defaults.Config.Imaging.Quality, + Anchor: -1, // The real values start at 0. + Hint: "photo", + Quality: defaults.Config.Imaging.Quality, + Compression: defaults.Config.Imaging.Compression, } } diff --git a/resources/images/images_golden_integration_test.go b/resources/images/images_golden_integration_test.go index d5a707024..a3976d567 100644 --- a/resources/images/images_golden_integration_test.go +++ b/resources/images/images_golden_integration_test.go @@ -21,6 +21,17 @@ import ( "github.com/gohugoio/hugo/resources/images/imagetesting" ) +const goldenProcess = ` +{{ define "process"}} +{{ $img := .img.Process .spec }} +{{ $ext := path.Ext $img.RelPermalink }} +{{ $name := printf "images/%s%s" (.spec | anchorize) $ext }} +{{ with $img | resources.Copy $name }} +{{ .Publish }} +{{ end }} +{{ end }} +` + // Note, if you're enabling writeGoldenFiles on a MacOS ARM 64 you need to run the test with GOARCH=amd64, e.g. func TestImagesGoldenFiltersMisc(t *testing.T) { t.Parallel() @@ -324,15 +335,8 @@ Home. {{ template "process" (dict "spec" "resize 100x100 r180" "img" $gopher) }} {{ template "process" (dict "spec" "resize 300x300 jpg #b31280" "img" $gopher) }} -{{ define "process"}} -{{ $img := .img.Process .spec }} -{{ $ext := path.Ext $img.RelPermalink }} -{{ $name := printf "images/%s%s" (.spec | anchorize) $ext }} -{{ with $img | resources.Copy $name }} -{{ .Publish }} -{{ end }} -{{ end }} -` + +` + goldenProcess opts := imagetesting.DefaultGoldenOpts opts.T = t @@ -378,7 +382,7 @@ Home. {{/* These are sorted. The end file name will be created from the spec + extension, so make sure these are unique. */}} {{ template "process" (dict "spec" "crop 300x300 gif" "img" $animWebp) }} {{ template "process" (dict "spec" "crop 300x300 smart" "img" $fuzzyCircle) }} - {{ template "process" (dict "spec" "crop 300x300 smart #ff9999" "img" $fuzzyCircle) }} +{{ template "process" (dict "spec" "crop 300x300 smart #ff9999" "img" $fuzzyCircle) }} {{ template "process" (dict "spec" "crop 300x300" "img" $animWebp) }} {{ template "process" (dict "spec" "crop 500x200 smart webp" "img" $sunset) }} {{ template "process" (dict "spec" "crop 500x200 smart webp" "img" $sunset) }} @@ -388,7 +392,7 @@ Home. {{ template "process" (dict "spec" "png" "img" $highContrast) }} {{ template "process" (dict "spec" "resize 300x300" "img" $giphy) }} {{ template "process" (dict "spec" "resize 300x300 webp" "img" $giphy) }} -{{ template "process" (dict "spec" "resize 300x300 webp q0" "img" $sunset) }} +{{ template "process" (dict "spec" "resize 300x300 webp lossless" "img" $sunset) }} {{ template "process" (dict "spec" "resize 300x300 webp q1" "img" $sunset) }} {{ template "process" (dict "spec" "resize 300x300 webp q33" "img" $sunset) }} {{ template "process" (dict "spec" "resize 300x300 webp q75" "img" $sunset) }} @@ -486,7 +490,7 @@ Home. {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "fit" "spec" "200x200" ) }} {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "200x200" ) }} {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "350x400 center" ) }} - {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "350x400 smart" ) }} +{{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "350x400 smart" ) }} {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "350x400 center r90" ) }} {{ template "invoke" (dict "copyFormat" "jpg" "base" $sunset "method" "crop" "spec" "350x400 center q20" ) }} {{ template "invoke" (dict "copyFormat" "png" "base" $gopher "method" "resize" "spec" "100x" ) }} @@ -521,3 +525,37 @@ Home. imagetesting.RunGolden(opts) } + +func TestImagesGoldenConfigLossyVsQuality(t *testing.T) { + t.Parallel() + + if imagetesting.SkipGoldenTests { + t.Skip("Skip golden test on this architecture") + } + + files := ` +-- hugo.toml -- +[imaging] +quality = 90 # will only apply to jpeg in this setup. +compression = "lossless" # for webp +-- assets/sunset.jpg -- +sourcefilename: ../testdata/sunset.jpg +-- layouts/home.html -- +Home. +{{ $sunset := resources.Get "sunset.jpg" }} +{{ template "process" (dict "spec" "resize 300x300 webp" "img" $sunset) }} +{{ template "process" (dict "spec" "resize 300x300 webp lossy" "img" $sunset) }} +{{ template "process" (dict "spec" "resize 300x300 jpeg" "img" $sunset) }} + +` + goldenProcess + + // Will be used as the base folder for generated images. + name := "losslessvsquality" + + opts := imagetesting.DefaultGoldenOpts + opts.T = t + opts.Name = name + opts.Files = files + + imagetesting.RunGolden(opts) +} diff --git a/resources/images/testdata/images_golden/losslessvsquality/resize-300x300-jpeg.jpg b/resources/images/testdata/images_golden/losslessvsquality/resize-300x300-jpeg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08fbff97c1a700bd9ebe93b0946a3cde0a341538 GIT binary patch literal 12148 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 z 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 literal 0 HcmV?d00001 diff --git a/resources/images/testdata/images_golden/losslessvsquality/resize-300x300-webp-lossy.webp b/resources/images/testdata/images_golden/losslessvsquality/resize-300x300-webp-lossy.webp new file mode 100644 index 0000000000000000000000000000000000000000..2e648b7be876bce8c9eb99cc9f5b779afc061390 GIT binary patch literal 7284 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 O7$6p-c??hX0001$#zCV1 literal 0 HcmV?d00001 diff --git a/resources/images/testdata/images_golden/process/webp/resize-300x300-webp-q0.webp b/resources/images/testdata/images_golden/losslessvsquality/resize-300x300-webp.webp similarity index 100% rename from resources/images/testdata/images_golden/process/webp/resize-300x300-webp-q0.webp rename to resources/images/testdata/images_golden/losslessvsquality/resize-300x300-webp.webp diff --git a/resources/images/testdata/images_golden/process/webp/resize-300x300-webp-lossless.webp b/resources/images/testdata/images_golden/process/webp/resize-300x300-webp-lossless.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee53c60301c3c266b2a7d69610b42d42031e9843 GIT binary patch literal 60736 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 z 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¨*Yk`xed;J|@}13>`;LxF;n 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