URI: 
       Shorten processed image filenames - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 216a69a1ef8c9f8efdec55e3680b7734a1fd52f4
   DIR parent e67886c038dc79755c14ec77bbeff6605953f9ef
  HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Tue, 30 Jul 2024 16:47:16 +0200
       
       Shorten processed image filenames
       
       Fixes #12688
       Fixes #12656
       
       Diffstat:
         M common/hashing/hashing.go           |       2 +-
         M common/hashing/hashing_test.go      |      25 +++++++++++++++++++++++++
         M hugolib/hugo_sites_multihost_test.… |       4 ++--
         M hugolib/image_test.go               |      18 ++++++++----------
         M hugolib/pagesfromdata/pagesfromgot… |       2 +-
         M hugolib/resource_chain_test.go      |       4 ++--
         M resources/image.go                  |      36 +++++++------------------------
         M resources/image_extended_test.go    |       2 +-
         M resources/image_test.go             |      34 ++++++++++++++++----------------
         M resources/resources_integration_te… |      13 +++++++------
         R resources/testdata/golden/giphy_hu… |       0 
         R resources/testdata/golden/giphy_hu… |       0 
         R resources/testdata/golden/giphy_hu… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gohugoio… |       0 
         R resources/testdata/golden/gopher-h… |       0 
         R resources/testdata/golden/gopher-h… |       0 
         R resources/testdata/golden/gopher-h… |       0 
         R resources/testdata/golden/gopher-h… |       0 
         R resources/testdata/golden/gradient… |       0 
         R resources/testdata/golden/gradient… |       0 
         R resources/testdata/golden/gradient… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden/sunset_h… |       0 
         R resources/testdata/golden_webp/fuz… |       0 
         M resources/transform_test.go         |       8 ++++----
         M tpl/resources/resources_integratio… |       2 +-
       
       111 files changed, 77 insertions(+), 73 deletions(-)
       ---
   DIR diff --git a/common/hashing/hashing.go b/common/hashing/hashing.go
       @@ -27,7 +27,7 @@ import (
        )
        
        // XXHashFromReader calculates the xxHash for the given reader.
       -func XXHashFromReader(r io.ReadSeeker) (uint64, int64, error) {
       +func XXHashFromReader(r io.Reader) (uint64, int64, error) {
                h := getXxHashReadFrom()
                defer putXxHashReadFrom(h)
        
   DIR diff --git a/common/hashing/hashing_test.go b/common/hashing/hashing_test.go
       @@ -17,6 +17,7 @@ import (
                "fmt"
                "math"
                "strings"
       +        "sync"
                "testing"
        
                qt "github.com/frankban/quicktest"
       @@ -32,6 +33,30 @@ func TestXxHashFromReader(t *testing.T) {
                c.Assert(got, qt.Equals, uint64(7148569436472236994))
        }
        
       +func TestXxHashFromReaderPara(t *testing.T) {
       +        c := qt.New(t)
       +
       +        var wg sync.WaitGroup
       +        for i := 0; i < 10; i++ {
       +                i := i
       +                wg.Add(1)
       +                go func() {
       +                        defer wg.Done()
       +                        for j := 0; j < 100; j++ {
       +                                s := strings.Repeat("Hello ", i+j+1*42)
       +                                r := strings.NewReader(s)
       +                                got, size, err := XXHashFromReader(r)
       +                                c.Assert(size, qt.Equals, int64(len(s)))
       +                                c.Assert(err, qt.IsNil)
       +                                expect, _ := XXHashFromString(s)
       +                                c.Assert(got, qt.Equals, expect)
       +                        }
       +                }()
       +        }
       +
       +        wg.Wait()
       +}
       +
        func TestXxHashFromString(t *testing.T) {
                c := qt.New(t)
                s := "Hello World"
   DIR diff --git a/hugolib/hugo_sites_multihost_test.go b/hugolib/hugo_sites_multihost_test.go
       @@ -203,9 +203,9 @@ title: mybundle-en
                b.AssertFileExists("public/de/mybundle/pixel.png", true)
                b.AssertFileExists("public/en/mybundle/pixel.png", true)
        
       -        b.AssertFileExists("public/de/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
       +        b.AssertFileExists("public/de/mybundle/pixel_hu8581513846771248023.png", true)
                // failing test below
       -        b.AssertFileExists("public/en/mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x2_resize_box_3.png", true)
       +        b.AssertFileExists("public/en/mybundle/pixel_hu8581513846771248023.png", true)
        }
        
        func TestMultihostResourceOneBaseURLWithSuPath(t *testing.T) {
   DIR diff --git a/hugolib/image_test.go b/hugolib/image_test.go
       @@ -72,22 +72,20 @@ SUNSET2: {{ $resized2.RelPermalink }}/{{ $resized2.Width }}/Lat: {{ $resized2.Ex
        
                b.Build(BuildCfg{})
        
       -        b.AssertFileContent("public/index.html", "SUNSET FOR: en: /bundle/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_resize_q75_box.jpg/200/Lat: 36.59744166666667")
       -        b.AssertFileContent("public/fr/index.html", "SUNSET FOR: fr: /bundle/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_resize_q75_box.jpg/200/Lat: 36.59744166666667")
       -        b.AssertFileContent("public/index.html", " SUNSET2: /images/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_123x234_resize_q75_box.jpg/123/Lat: 36.59744166666667")
       -        b.AssertFileContent("public/nn/index.html", " SUNSET2: /images/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_123x234_resize_q75_box.jpg/123/Lat: 36.59744166666667")
       +        b.AssertFileContent("public/index.html", "SUNSET FOR: en: /bundle/sunset_hu13235715490294913361.jpg/200/Lat: 36.59744166666667")
       +        b.AssertFileContent("public/fr/index.html", "SUNSET FOR: fr: /bundle/sunset_hu13235715490294913361.jpg/200/Lat: 36.59744166666667")
       +        b.AssertFileContent("public/index.html", " SUNSET2: /images/sunset_hu1573057890424052540.jpg/123/Lat: 36.59744166666667")
       +        b.AssertFileContent("public/nn/index.html", " SUNSET2: /images/sunset_hu1573057890424052540.jpg/123/Lat: 36.59744166666667")
        
       -        b.AssertImage(200, 200, "public/bundle/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_resize_q75_box.jpg")
       +        b.AssertImage(200, 200, "public/bundle/sunset_hu13235715490294913361.jpg")
        
                // Check the file cache
       -        b.AssertImage(200, 200, "resources/_gen/images/bundle/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_resize_q75_box.jpg")
       +        b.AssertImage(200, 200, "resources/_gen/images/bundle/sunset_hu13235715490294913361.jpg")
        
       -        b.AssertFileContent("resources/_gen/images/bundle/sunset_2020904703097093419.json",
       +        b.AssertFileContent("resources/_gen/images/bundle/sunset_17710516992648092201.json",
                        "FocalLengthIn35mmFormat|uint16", "PENTAX")
        
       -        b.AssertImage(123, 234, "resources/_gen/images/images/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_123x234_resize_q75_box.jpg")
       -
       -        b.AssertFileContent("resources/_gen/images/images/sunset_2020904703097093419.json",
       +        b.AssertFileContent("resources/_gen/images/images/sunset_17710516992648092201.json",
                        "FocalLengthIn35mmFormat|uint16", "PENTAX")
        
                b.AssertNoDuplicateWrites()
   DIR diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
       @@ -119,7 +119,7 @@ docs/p1/sub/mymixcasetext2.txt
                        "RelPermalink: /docs/p1/sub/mymixcasetext2.txt|Name: sub/mymixcasetext2.txt|",
                        "RelPermalink: /mydata.yaml|Name: sub/data1.yaml|Title: Sub data|Params: map[]|",
                        "Featured Image: /a/pixel.png|featured.png|",
       -                "Resized Featured Image: /a/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_10x10_resize_box_3.png|10|",
       +                "Resized Featured Image: /a/pixel_hu16809842526914527184.png|10|",
                        // Resource from string
                        "RelPermalink: /docs/p1/mytext.txt|Name: textresource|Title: My Text Resource|Params: map[param1:param1v]|",
                        // Dates
   DIR diff --git a/hugolib/resource_chain_test.go b/hugolib/resource_chain_test.go
       @@ -106,12 +106,12 @@ FAILED REMOTE ERROR DETAILS CONTENT: {{ with $failedImg.Err }}|{{ . }}|{{ with .
                        b.AssertFileContent("public/index.html",
                                fmt.Sprintf(`
        SUNSET: /images/sunset.jpg|/images/sunset.a9bf1d944e19c0f382e0d8f51de690f7d0bc8fa97390c4242a86c3e5c0737e71.jpg|900|90587
       -FIT: /images/sunset.jpg|/images/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_fit_q75_box.jpg|200
       +FIT: /images/sunset.jpg|/images/sunset_hu15210517121918042184.jpg|200
        CSS integrity Data first: sha256-od9YaHw8nMOL8mUy97Sy8sKwMV3N4hI3aVmZXATxH&#43;8= /styles.min.a1df58687c3c9cc38bf26532f7b4b2f2c2b0315dcde212376959995c04f11fef.css
        CSS integrity Data last:  /styles2.min.1cfc52986836405d37f9998a63fd6dd8608e8c410e5e3db1daaa30f78bc273ba.css sha256-HPxSmGg2QF03&#43;ZmKY/1t2GCOjEEOXj2x2qow94vCc7o=
        
        SUNSET REMOTE: /sunset_%[1]s.jpg|/sunset_%[1]s.a9bf1d944e19c0f382e0d8f51de690f7d0bc8fa97390c4242a86c3e5c0737e71.jpg|900|90587
       -FIT REMOTE: /sunset_%[1]s.jpg|/sunset_%[1]s_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_fit_q75_box.jpg|200
       +FIT REMOTE: /sunset_%[1]s.jpg|/sunset_%[1]s_hu15210517121918042184.jpg|200
        REMOTE NOT FOUND: OK
        LOCAL NOT FOUND: OK
        PRINT PROTOCOL ERROR DETAILS: Err: error calling resources.GetRemote: Get "gopher://example.org": unsupported protocol scheme "gopher"||
   DIR diff --git a/resources/image.go b/resources/image.go
       @@ -490,36 +490,16 @@ func (i *imageResource) relTargetPathFromConfig(conf images.ImageConfig) interna
                if conf.TargetFormat != i.Format {
                        p2 = conf.TargetFormat.DefaultExtension()
                }
       -
       -        h := i.hash()
       -        idStr := fmt.Sprintf("_hu%d_%d", h, i.size())
       -
       -        // Do not change for no good reason.
       -        const md5Threshold = 100
       -
       -        key := conf.GetKey(i.Format)
       -
       -        // It is useful to have the key in clear text, but when nesting transforms, it
       -        // can easily be too long to read, and maybe even too long
       -        // for the different OSes to handle.
       -        if len(p1)+len(idStr)+len(p2) > md5Threshold {
       -                key = hashing.MD5FromStringHexEncoded(p1 + key + p2)
       -                huIdx := strings.Index(p1, "_hu")
       -                if huIdx != -1 {
       -                        p1 = p1[:huIdx]
       -                } else {
       -                        // This started out as a very long file name. Making it even longer
       -                        // could melt ice in the Arctic.
       -                        p1 = ""
       -                }
       -        } else if strings.Contains(p1, idStr) {
       -                // On scaling an already scaled image, we get the file info from the original.
       -                // Repeating the same info in the filename makes it stuttery for no good reason.
       -                idStr = ""
       +        const prefix = "_hu"
       +        huIdx := strings.LastIndex(p1, prefix)
       +        incomingID := "i"
       +        if huIdx > -1 {
       +                incomingID = p1[huIdx+len(prefix):]
       +                p1 = p1[:huIdx]
                }
       -
       +        hash := hashing.HashUint64(incomingID, i.hash(), conf.GetKey(i.Format))
                rp := i.getResourcePaths()
       -        rp.File = fmt.Sprintf("%s%s_%s%s", p1, idStr, key, p2)
       +        rp.File = fmt.Sprintf("%s%s%d%s", p1, prefix, hash, p2)
        
                return rp
        }
   DIR diff --git a/resources/image_extended_test.go b/resources/image_extended_test.go
       @@ -42,6 +42,6 @@ func TestImageResizeWebP(t *testing.T) {
                resized, err := image.Resize("123x")
                c.Assert(err, qt.IsNil)
                c.Assert(image.MediaType(), qt.Equals, media.Builtin.WEBPType)
       -        c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunrise_hu6ad68bcbae1b79cbc2f6b451894deaf6_95652_123x0_resize_q68_h2_linear_2.webp")
       +        c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunrise_hu544374262273649331.webp")
                c.Assert(resized.Width(), qt.Equals, 123)
        }
   DIR diff --git a/resources/image_test.go b/resources/image_test.go
       @@ -123,28 +123,28 @@ func TestImageTransformBasic(t *testing.T) {
                assertWidthHeight(resizedAndRotated, 125, 200)
        
                assertWidthHeight(resized, 300, 200)
       -        c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_300x200_resize_q68_linear.jpg")
       +        c.Assert(resized.RelPermalink(), qt.Equals, "/a/sunset_hu2082030801149749592.jpg")
        
                fitted, err := resized.Fit("50x50")
                c.Assert(err, qt.IsNil)
       -        c.Assert(fitted.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_625708021e2bb281c9f1002f88e4753f.jpg")
       +        c.Assert(fitted.RelPermalink(), qt.Equals, "/a/sunset_hu16263619592447877226.jpg")
                assertWidthHeight(fitted, 50, 33)
        
                // Check the MD5 key threshold
                fittedAgain, _ := fitted.Fit("10x20")
                fittedAgain, err = fittedAgain.Fit("10x20")
                c.Assert(err, qt.IsNil)
       -        c.Assert(fittedAgain.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_3f65ba24dc2b7fba0f56d7f104519157.jpg")
       +        c.Assert(fittedAgain.RelPermalink(), qt.Equals, "/a/sunset_hu847809310637164306.jpg")
                assertWidthHeight(fittedAgain, 10, 7)
        
                filled, err := image.Fill("200x100 bottomLeft")
                c.Assert(err, qt.IsNil)
       -        c.Assert(filled.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x100_fill_q68_linear_bottomleft.jpg")
       +        c.Assert(filled.RelPermalink(), qt.Equals, "/a/sunset_hu18289448341423092707.jpg")
                assertWidthHeight(filled, 200, 100)
        
                smart, err := image.Fill("200x100 smart")
                c.Assert(err, qt.IsNil)
       -        c.Assert(smart.RelPermalink(), qt.Equals, fmt.Sprintf("/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x100_fill_q68_linear_smart%d.jpg", 1))
       +        c.Assert(smart.RelPermalink(), qt.Equals, "/a/sunset_hu11649371610839769766.jpg")
                assertWidthHeight(smart, 200, 100)
        
                // Check cache
       @@ -154,12 +154,12 @@ func TestImageTransformBasic(t *testing.T) {
        
                cropped, err := image.Crop("300x300 topRight")
                c.Assert(err, qt.IsNil)
       -        c.Assert(cropped.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_300x300_crop_q68_linear_topright.jpg")
       +        c.Assert(cropped.RelPermalink(), qt.Equals, "/a/sunset_hu2242042514052853140.jpg")
                assertWidthHeight(cropped, 300, 300)
        
                smartcropped, err := image.Crop("200x200 smart")
                c.Assert(err, qt.IsNil)
       -        c.Assert(smartcropped.RelPermalink(), qt.Equals, fmt.Sprintf("/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_200x200_crop_q68_linear_smart%d.jpg", 1))
       +        c.Assert(smartcropped.RelPermalink(), qt.Equals, "/a/sunset_hu12983255101170993571.jpg")
                assertWidthHeight(smartcropped, 200, 200)
        
                // Check cache
       @@ -226,7 +226,7 @@ func TestImageTransformFormat(t *testing.T) {
        
                imagePng, err := image.Resize("450x png")
                c.Assert(err, qt.IsNil)
       -        c.Assert(imagePng.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_450x0_resize_linear.png")
       +        c.Assert(imagePng.RelPermalink(), qt.Equals, "/a/sunset_hu11737890885216583918.png")
                c.Assert(imagePng.ResourceType(), qt.Equals, "image")
                assertExtWidthHeight(imagePng, ".png", 450, 281)
                c.Assert(imagePng.Name(), qt.Equals, "sunset.jpg")
       @@ -234,7 +234,7 @@ func TestImageTransformFormat(t *testing.T) {
        
                imageGif, err := image.Resize("225x gif")
                c.Assert(err, qt.IsNil)
       -        c.Assert(imageGif.RelPermalink(), qt.Equals, "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_225x0_resize_linear.gif")
       +        c.Assert(imageGif.RelPermalink(), qt.Equals, "/a/sunset_hu1431827106749674475.gif")
                c.Assert(imageGif.ResourceType(), qt.Equals, "image")
                assertExtWidthHeight(imageGif, ".gif", 225, 141)
                c.Assert(imageGif.Name(), qt.Equals, "sunset.jpg")
       @@ -257,7 +257,7 @@ func TestImagePermalinkPublishOrder(t *testing.T) {
                                }()
        
                                check1 := func(img images.ImageResource) {
       -                                resizedLink := "/a/sunset_hu59e56ffff1bc1d8d122b1403d34e039f_90587_100x50_resize_q75_box.jpg"
       +                                resizedLink := "/a/sunset_hu7919355342577096259.jpg"
                                        c.Assert(img.RelPermalink(), qt.Equals, resizedLink)
                                        assertImageFile(c, spec.PublishFs, resizedLink, 100, 50)
                                }
       @@ -298,12 +298,12 @@ func TestImageBugs(t *testing.T) {
                        c.Assert(err, qt.IsNil)
                        c.Assert(resized, qt.Not(qt.IsNil))
                        c.Assert(resized.Width(), qt.Equals, 200)
       -                c.Assert(resized.RelPermalink(), qt.Equals, "/a/_hu59e56ffff1bc1d8d122b1403d34e039f_90587_65b757a6e14debeae720fe8831f0a9bc.jpg")
       +                c.Assert(resized.RelPermalink(), qt.Equals, "/a/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph_hu9514381480012510326.jpg")
                        resized, err = resized.Resize("100x")
                        c.Assert(err, qt.IsNil)
                        c.Assert(resized, qt.Not(qt.IsNil))
                        c.Assert(resized.Width(), qt.Equals, 100)
       -                c.Assert(resized.RelPermalink(), qt.Equals, "/a/_hu59e56ffff1bc1d8d122b1403d34e039f_90587_c876768085288f41211f768147ba2647.jpg")
       +                c.Assert(resized.RelPermalink(), qt.Equals, "/a/1234567890qwertyuiopasdfghjklzxcvbnm5to6eeeeee7via8eleph_hu1776700126481066216.jpg")
                })
        
                // Issue #6137
       @@ -401,7 +401,7 @@ func TestImageResize8BitPNG(t *testing.T) {
                resized, err := image.Resize("800x")
                c.Assert(err, qt.IsNil)
                c.Assert(resized.MediaType().Type, qt.Equals, "image/png")
       -        c.Assert(resized.RelPermalink(), qt.Equals, "/a/gohugoio_hu0e1b9e4a4be4d6f86c7b37b9ccce3fbc_73886_800x0_resize_linear_3.png")
       +        c.Assert(resized.RelPermalink(), qt.Equals, "/a/gohugoio_hu8582372628235034388.png")
                c.Assert(resized.Width(), qt.Equals, 800)
        }
        
       @@ -814,10 +814,10 @@ func assetGoldenDirs(c *qt.C, dir1, dir2 string) {
        
                                if !goldenEqual(nrgba1, nrgba2) {
                                        switch fi1.Name() {
       -                                case "gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_73c19c5f80881858a85aa23cd0ca400d.png",
       -                                        "gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_ae631e5252bb5d7b92bc766ad1a89069.png",
       -                                        "gohugoio8_hu7f72c00afdf7634587afaa5eff2a25b2_73538_d1bbfa2629bffb90118cacce3fcfb924.png",
       -                                        "giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_200x0_resize_box_1.gif":
       +                                case "giphy_hu13007323561585908901.gif",
       +                                        "gohugoio8_hu12690451569630232821.png",
       +                                        "gohugoio8_hu1619987041333606118.png",
       +                                        "gohugoio8_hu18164141965527013334.png":
                                                c.Log("expectedly differs from golden due to dithering:", fi1.Name())
                                        default:
                                                c.Errorf("resulting image differs from golden: %s", fi1.Name())
   DIR diff --git a/resources/resources_integration_test.go b/resources/resources_integration_test.go
       @@ -27,6 +27,7 @@ func TestImageCache(t *testing.T) {
        
                files := `
        -- config.toml --
       +disableLiveReload = true
        baseURL = "https://example.org"
        -- content/mybundle/index.md --
        ---
       @@ -61,9 +62,9 @@ anigif: {{ $anigif.RelPermalink }}|{{ $anigif.Width }}|{{ $anigif.Height }}|{{ $
        
                assertImages := func() {
                        b.AssertFileContent("public/index.html", `
       -                gif: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x2_resize_box_3.gif|}|1|2|image/gif|
       -                bmp: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x3_resize_box_3.bmp|}|2|3|image/bmp|
       -                anigif: /mybundle/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_4x5_resize_box_1.gif|4|5|image/gif|
       +                gif: /mybundle/pixel_hu14657638653019978294.gif|}|1|2|image/gif|
       +                bmp: /mybundle/pixel_hu14705577916774115224.bmp|}|2|3|image/bmp|
       +                anigif: /mybundle/giphy_hu3665406585348417395.gif|4|5|image/gif|
                        `)
                }
        
       @@ -159,9 +160,9 @@ resize 2|RelPermalink: {{ $image.RelPermalink }}|MediaType: {{ $image.MediaType 
                b := hugolib.Test(t, files)
        
                b.AssertFileContent("public/index.html",
       -                "jpg|RelPermalink: /images/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_filter_1397118720664523257.jpg|MediaType: image/jpeg|Width: 1|Height: 1|",
       -                "resize 1|RelPermalink: /images/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_filter_3796633496882814163.jpg|MediaType: image/jpeg|Width: 20|Height: 30|",
       -                "resize 2|RelPermalink: /images/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_filter_3796633496882814163.jpg|MediaType: image/jpeg|Width: 20|Height: 30|",
       +                "jpg|RelPermalink: /images/pixel_hu13683954895608450100.jpg|MediaType: image/jpeg|Width: 1|Height: 1|",
       +                "resize 1|RelPermalink: /images/pixel_hu3453403302435331853.jpg|MediaType: image/jpeg|Width: 20|Height: 30|",
       +                "resize 2|RelPermalink: /images/pixel_hu3453403302435331853.jpg|MediaType: image/jpeg|Width: 20|Height: 30|",
                )
        }
        
   DIR diff --git a/resources/testdata/golden/giphy_hu2834162883155351332_0_200x0_resize_box_1.gif b/resources/testdata/golden/giphy_hu13007323561585908901.gif
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/giphy_hu2834162883155351332_0_512x0_resize_box_1.gif b/resources/testdata/golden/giphy_hu15867760255711130632.gif
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/giphy_hu2834162883155351332_0_100x0_resize_q75_bgffffff_box_1.jpg b/resources/testdata/golden/giphy_hu6128044492074974243.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio-card_hu4315323919404496126_0_220x0_resize_box_1.gif b/resources/testdata/golden/gohugoio-card_hu2987156907072306909.gif
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio-card_hu4315323919404496126_0_100x0_resize_box_1.gif b/resources/testdata/golden/gohugoio-card_hu5424444801046891674.gif
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_1368160528378247482.png b/resources/testdata/golden/gohugoio24_hu10797171466856050177.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_4500301550729488566.png b/resources/testdata/golden/gohugoio24_hu11107750106104480197.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_16769769134069376407.png b/resources/testdata/golden/gohugoio24_hu11329286024190801059.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_15932678542579281584.png b/resources/testdata/golden/gohugoio24_hu12210858383293148143.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_bottomleft_3.png b/resources/testdata/golden/gohugoio24_hu13086833506724393086.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_6663284144007557192.png b/resources/testdata/golden/gohugoio24_hu13525767338321336398.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_4537007754286294453.png b/resources/testdata/golden/gohugoio24_hu1369355309314118179.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_12108901413150876595.png b/resources/testdata/golden/gohugoio24_hu1400913850517810505.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_600x0_resize_box_3.png b/resources/testdata/golden/gohugoio24_hu14141684530559227507.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_1999930288179126795.png b/resources/testdata/golden/gohugoio24_hu14186438102343930541.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_10484317606894136532.png b/resources/testdata/golden/gohugoio24_hu15334383941700802690.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_300x200_fill_gaussian_smart1_3.png b/resources/testdata/golden/gohugoio24_hu16565102657258557500.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_6226609227946633992.png b/resources/testdata/golden/gohugoio24_hu17044066173912896721.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_7394663371967385838.png b/resources/testdata/golden/gohugoio24_hu17704168266634609966.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_4355974086897058214.png b/resources/testdata/golden/gohugoio24_hu18417462639738980704.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3.png b/resources/testdata/golden/gohugoio24_hu2731125086148712886.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_10145879774663310287.png b/resources/testdata/golden/gohugoio24_hu281918710943920862.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_9987965893403929502.png b/resources/testdata/golden/gohugoio24_hu3440533624707313030.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_17478916973129747965.png b/resources/testdata/golden/gohugoio24_hu4079163993667427623.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_300x100_fill_nearestneighbor_topleft_3.png b/resources/testdata/golden/gohugoio24_hu4425915891794988430.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_200x0_resize_q50_r90_box_3.png b/resources/testdata/golden/gohugoio24_hu4576019605973288331.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_200x100_resize_box_3.png b/resources/testdata/golden/gohugoio24_hu4640928585673549425.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_100x100_fill_box_center_3.png b/resources/testdata/golden/gohugoio24_hu5007208529579570920.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_16826185614123406698.png b/resources/testdata/golden/gohugoio24_hu5216349243587511129.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_11093326483404439501.png b/resources/testdata/golden/gohugoio24_hu578735004461910616.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_35625387183264766.png b/resources/testdata/golden/gohugoio24_hu5858624748295381298.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_400x200_fill_box_center_3_filter_16851788174025928944.png b/resources/testdata/golden/gohugoio24_hu7784426158237953794.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio24_hu7834617682594811866_0_300x200_fit_linear_3.png b/resources/testdata/golden/gohugoio24_hu7862113105739619058.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_17478916973129747965.png b/resources/testdata/golden/gohugoio8_hu11148399329171024835.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_7394663371967385838.png b/resources/testdata/golden/gohugoio8_hu11427867868933654094.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_1368160528378247482.png b/resources/testdata/golden/gohugoio8_hu1162986745985451229.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_12108901413150876595.png b/resources/testdata/golden/gohugoio8_hu11638877035372353818.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_4355974086897058214.png b/resources/testdata/golden/gohugoio8_hu1217888005047574594.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_9987965893403929502.png b/resources/testdata/golden/gohugoio8_hu12220589162864061188.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_10484317606894136532.png b/resources/testdata/golden/gohugoio8_hu12690451569630232821.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_bottomleft_3.png b/resources/testdata/golden/gohugoio8_hu12777352499229939257.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3.png b/resources/testdata/golden/gohugoio8_hu13982221718330949681.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_15932678542579281584.png b/resources/testdata/golden/gohugoio8_hu14107602960808127665.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_1999930288179126795.png b/resources/testdata/golden/gohugoio8_hu14156562190479686537.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_16826185614123406698.png b/resources/testdata/golden/gohugoio8_hu14592039178820708584.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_16769769134069376407.png b/resources/testdata/golden/gohugoio8_hu14839804078094713214.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_11093326483404439501.png b/resources/testdata/golden/gohugoio8_hu1619987041333606118.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_4537007754286294453.png b/resources/testdata/golden/gohugoio8_hu17499078314270725360.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_10145879774663310287.png b/resources/testdata/golden/gohugoio8_hu18164141965527013334.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_4500301550729488566.png b/resources/testdata/golden/gohugoio8_hu3062751268037078239.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_100x100_fill_box_center_3.png b/resources/testdata/golden/gohugoio8_hu3419127525388578393.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_6663284144007557192.png b/resources/testdata/golden/gohugoio8_hu3589035650602432929.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_16851788174025928944.png b/resources/testdata/golden/gohugoio8_hu5613016746654861839.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_200x100_resize_box_3.png b/resources/testdata/golden/gohugoio8_hu5911891014248513491.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_300x100_fill_nearestneighbor_topleft_3.png b/resources/testdata/golden/gohugoio8_hu5964606204514209824.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_600x0_resize_box_3.png b/resources/testdata/golden/gohugoio8_hu7954024233587195445.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_200x0_resize_q50_r90_box_3.png b/resources/testdata/golden/gohugoio8_hu8497843748973739779.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_300x200_fill_gaussian_smart1_3.png b/resources/testdata/golden/gohugoio8_hu8680424146433003017.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_300x200_fit_linear_3.png b/resources/testdata/golden/gohugoio8_hu881093787809754101.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_35625387183264766.png b/resources/testdata/golden/gohugoio8_hu9175902413241406055.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gohugoio8_hu3730316029470468128_0_400x200_fill_box_center_3_filter_6226609227946633992.png b/resources/testdata/golden/gohugoio8_hu971124074666261597.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gopher-hero8_hu15519140586546988538_0_200x0_resize_q75_bge3e615_box_3.jpg b/resources/testdata/golden/gopher-hero8_hu18029321441728138356.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gopher-hero8_hu15519140586546988538_0_filter_18247526396371657121.png b/resources/testdata/golden/gopher-hero8_hu7599356179908845799.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gopher-hero8_hu15519140586546988538_0_200x0_resize_bge3e615_box_3.png b/resources/testdata/golden/gopher-hero8_hu8339547226364980332.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gopher-hero8_hu15519140586546988538_0_30x0_resize_box_3.png b/resources/testdata/golden/gopher-hero8_hu9718283601959448032.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gradient-circle_hu6504854814255106391_0_200x0_resize_q75_bge3e615_box_3.jpg b/resources/testdata/golden/gradient-circle_hu13051041682786618472.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gradient-circle_hu6504854814255106391_0_filter_18247526396371657121.png b/resources/testdata/golden/gradient-circle_hu2995269612296002085.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/gradient-circle_hu6504854814255106391_0_200x0_resize_bge3e615_box_3.png b/resources/testdata/golden/gradient-circle_hu4182458540361883551.png
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_200x0_resize_q50_r90_box.jpg b/resources/testdata/golden/sunset_hu10303518067937744186.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_bottomleft.jpg b/resources/testdata/golden/sunset_hu10327704110867657089.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_600x0_resize_q75_box.jpg b/resources/testdata/golden/sunset_hu10555571028775464444.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_11093326483404439501.jpg b/resources/testdata/golden/sunset_hu10706797811022665574.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_300x200_fit_q75_linear.jpg b/resources/testdata/golden/sunset_hu1184697552324640242.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_15932678542579281584.jpg b/resources/testdata/golden/sunset_hu13997988183102182682.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_filter_2739339915147920042.jpg b/resources/testdata/golden/sunset_hu14647978205320151651.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_16851788174025928944.jpg b/resources/testdata/golden/sunset_hu1508817148191451926.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_300x100_fill_q75_nearestneighbor_topleft.jpg b/resources/testdata/golden/sunset_hu15092417974014570823.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center.jpg b/resources/testdata/golden/sunset_hu15553011452282641860.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_1368160528378247482.jpg b/resources/testdata/golden/sunset_hu16406839322505000040.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_1999930288179126795.jpg b/resources/testdata/golden/sunset_hu17096332274161262571.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_filter_7649370997474087000.jpg b/resources/testdata/golden/sunset_hu17735388202135872885.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_300x200_fill_q75_gaussian_smart1.jpg b/resources/testdata/golden/sunset_hu18138233340135699657.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_17478916973129747965.jpg b/resources/testdata/golden/sunset_hu18339759113732359089.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_16769769134069376407.jpg b/resources/testdata/golden/sunset_hu1940616730388248148.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_4355974086897058214.jpg b/resources/testdata/golden/sunset_hu2317318497170846135.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_6663284144007557192.jpg b/resources/testdata/golden/sunset_hu2620328362006291004.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_4500301550729488566.jpg b/resources/testdata/golden/sunset_hu3329557056351636779.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_35625387183264766.jpg b/resources/testdata/golden/sunset_hu3528013170819345965.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_200x100_resize_q75_box.jpg b/resources/testdata/golden/sunset_hu4475169669413030903.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_7394663371967385838.jpg b/resources/testdata/golden/sunset_hu4645485093540451131.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_10484317606894136532.jpg b/resources/testdata/golden/sunset_hu5700214275785775137.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_4537007754286294453.jpg b/resources/testdata/golden/sunset_hu5943101889480068836.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_9987965893403929502.jpg b/resources/testdata/golden/sunset_hu6418511461467579286.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_16826185614123406698.jpg b/resources/testdata/golden/sunset_hu7124641571345460976.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_100x100_fill_q75_box_center.jpg b/resources/testdata/golden/sunset_hu7168213667150853195.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_10145879774663310287.jpg b/resources/testdata/golden/sunset_hu8110718388195953309.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_6226609227946633992.jpg b/resources/testdata/golden/sunset_hu8726458014885573310.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden/sunset_hu13399802095542588467_0_400x200_fill_q75_box_center_filter_12108901413150876595.jpg b/resources/testdata/golden/sunset_hu9995349819947557369.jpg
       Binary files differ.
   DIR diff --git a/resources/testdata/golden_webp/fuzzy-cirlcle_hu525d1a6cf670e85f5e8f19890241399b_26792_200x0_resize_q75_h2_box_3.webp b/resources/testdata/golden_webp/fuzzy-cirlcle_hu11078464949742740533.webp
       Binary files differ.
   DIR diff --git a/resources/transform_test.go b/resources/transform_test.go
       @@ -386,15 +386,15 @@ func TestTransform(t *testing.T) {
                        resizedPublished1, err := img.Resize("40x40")
                        c.Assert(err, qt.IsNil)
                        c.Assert(resizedPublished1.Height(), qt.Equals, 40)
       -                c.Assert(resizedPublished1.RelPermalink(), qt.Equals, "/gopher.changed_hu2e827f5a78333ebc04166dd643235dea_1462_40x40_resize_linear_3.png")
       -                assertShouldExist(c, spec, "public/gopher.changed_hu2e827f5a78333ebc04166dd643235dea_1462_40x40_resize_linear_3.png", true)
       +                c.Assert(resizedPublished1.RelPermalink(), qt.Equals, "/gopher.changed_hu16988682630555427117.png")
       +                assertShouldExist(c, spec, "public/gopher.changed_hu16988682630555427117.png", true)
        
                        // Permalink called.
                        resizedPublished2, err := img.Resize("30x30")
                        c.Assert(err, qt.IsNil)
                        c.Assert(resizedPublished2.Height(), qt.Equals, 30)
       -                c.Assert(resizedPublished2.Permalink(), qt.Equals, "https://example.com/gopher.changed_hu2e827f5a78333ebc04166dd643235dea_1462_30x30_resize_linear_3.png")
       -                assertShouldExist(c, spec, "public/gopher.changed_hu2e827f5a78333ebc04166dd643235dea_1462_30x30_resize_linear_3.png", true)
       +                c.Assert(resizedPublished2.Permalink(), qt.Equals, "https://example.com/gopher.changed_hu14141325020798305104.png")
       +                assertShouldExist(c, spec, "public/gopher.changed_hu14141325020798305104.png", true)
        
                        // Not published because none of RelPermalink or Permalink was called.
                        resizedNotPublished, err := img.Resize("50x50")
   DIR diff --git a/tpl/resources/resources_integration_test.go b/tpl/resources/resources_integration_test.go
       @@ -58,7 +58,7 @@ Copy3: {{ $copy3.RelPermalink}}|{{ $copy3.MediaType }}|{{ $copy3.Content | safeJ
        
                b.AssertFileContent("public/index.html", `
        Image Orig:  /blog/images/pixel.png|image/png|1|1|
       -Image Copy1:  /blog/images/copy_hu8aa3346827e49d756ff4e630147c42b5_70_3x4_resize_box_3.png|image/png|3|4|
       +Image Copy1:  /blog/images/copy_hu2891316072287293157.png|image/png|3|4|
        Image Copy2:  /blog/images/copy2.png|image/png|3|4
        Image Copy3:  image/png|3|4|
        Orig: /blog/js/foo.js|text/javascript|let foo;|