From e10aa76612bf20ca2a5aa8e7ee5e4d1aae0ba69f Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:43:14 +0200 Subject: [PATCH] [chore] Only call `imaging.Resize when necessary`, use even tinier blurhashes (#3247) * [chore] Use `imaging.Fit`, use even tinier blurhashes * avoid calling resize if not necessary * update blurhashes + thumb --- .../api/client/instance/instancepatch_test.go | 2 +- internal/api/client/media/mediacreate_test.go | 4 +- internal/media/manager_test.go | 16 +++--- internal/media/thumbnail.go | 54 +++++++++++++++--- internal/media/util.go | 33 ----------- testrig/media/thoughtsofdog-small.jpeg | Bin 20394 -> 20395 bytes testrig/testmodels.go | 4 +- 7 files changed, 60 insertions(+), 53 deletions(-) diff --git a/internal/api/client/instance/instancepatch_test.go b/internal/api/client/instance/instancepatch_test.go index 5c5d59ef8..6148ed93e 100644 --- a/internal/api/client/instance/instancepatch_test.go +++ b/internal/api/client/instance/instancepatch_test.go @@ -858,7 +858,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch8() { "static_url": "http://localhost:8080/fileserver/01AY6P665V14JJR0AFVRT7311Y/attachment/small/`+instanceAccount.AvatarMediaAttachment.ID+`.webp",`+` "thumbnail_static_type": "image/webp", "thumbnail_description": "A bouncing little green peglin.", - "blurhash": "LE9as6M}4YtO%dRlWEt6Dmoxx?WC" + "blurhash": "LF9kG$RR4YtP%dR+V^t5D,oxx?WC" }`, string(instanceV2ThumbnailJson)) // double extra special bonus: now update the image description without changing the image diff --git a/internal/api/client/media/mediacreate_test.go b/internal/api/client/media/mediacreate_test.go index 7f8cc2d87..e7f98d6d7 100644 --- a/internal/api/client/media/mediacreate_test.go +++ b/internal/api/client/media/mediacreate_test.go @@ -206,7 +206,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateSuccessful() { Y: 0.5, }, }, *attachmentReply.Meta) - suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", *attachmentReply.Blurhash) + suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", *attachmentReply.Blurhash) suite.NotEmpty(attachmentReply.ID) suite.NotEmpty(attachmentReply.URL) suite.NotEmpty(attachmentReply.PreviewURL) @@ -291,7 +291,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateSuccessfulV2() { Y: 0.5, }, }, *attachmentReply.Meta) - suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", *attachmentReply.Blurhash) + suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", *attachmentReply.Blurhash) suite.NotEmpty(attachmentReply.ID) suite.Nil(attachmentReply.URL) suite.NotEmpty(attachmentReply.PreviewURL) diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 87777ea30..ff38176f1 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -276,7 +276,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcess() { suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) suite.Equal(22858, attachment.Thumbnail.FileSize) - suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) + suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -429,7 +429,7 @@ func (suite *ManagerTestSuite) TestSlothVineProcess() { suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(312453, attachment.File.FileSize) suite.Equal(5648, attachment.Thumbnail.FileSize) - suite.Equal("LhIrNMt6Nsj[t7ayW.j[_4WBsWkB", attachment.Blurhash) + suite.Equal("LfIYH~xtNskCxtfPW.kB_4aespof", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -489,7 +489,7 @@ func (suite *ManagerTestSuite) TestLongerMp4Process() { suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(109569, attachment.File.FileSize) suite.Equal(2976, attachment.Thumbnail.FileSize) - suite.Equal("L8QJfm~qD%_3_3D%t7RjM{j[ofRj", attachment.Blurhash) + suite.Equal("LJQJfm?bM{?b~qRjt7WBayWBofWB", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -549,7 +549,7 @@ func (suite *ManagerTestSuite) TestBirdnestMp4Process() { suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(1409625, attachment.File.FileSize) suite.Equal(14478, attachment.Thumbnail.FileSize) - suite.Equal("LKF~w1RjRO.99DM_RPaetkV?WCMw", attachment.Blurhash) + suite.Equal("LJF?FZV@RO.99DM_RPWAx]V?ayMw", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -657,7 +657,7 @@ func (suite *ManagerTestSuite) TestPngNoAlphaChannelProcess() { suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(17471, attachment.File.FileSize) suite.Equal(6446, attachment.Thumbnail.FileSize) - suite.Equal("LDQcrD%i-?aj%ho#M~RP~nf3~nt2", attachment.Blurhash) + suite.Equal("LFQT7e.A%O%4?co$M}M{_1W9~TxV", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -713,7 +713,7 @@ func (suite *ManagerTestSuite) TestPngAlphaChannelProcess() { suite.Equal("image/webp", attachment.Thumbnail.ContentType) suite.Equal(18832, attachment.File.FileSize) suite.Equal(3592, attachment.Thumbnail.FileSize) - suite.Equal("LBOW$@%i-rak%go#RSRP_1av~Ts+", attachment.Blurhash) + suite.Equal("LCONII.A%Oxw?co#M}M{_1ac~TxV", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -769,7 +769,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithCallback() { suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) suite.Equal(22858, attachment.Thumbnail.FileSize) - suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) + suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) @@ -847,7 +847,7 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessWithDiskStorage() { suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) suite.Equal(269739, attachment.File.FileSize) suite.Equal(22858, attachment.Thumbnail.FileSize) - suite.Equal("LjCGfG#6RkRn_NvzRjWF?urqV@a$", attachment.Blurhash) + suite.Equal("LiBzRk#6V[WF_NvzV@WY_3rqV@a$", attachment.Blurhash) // now make sure the attachment is in the database dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachment.ID) diff --git a/internal/media/thumbnail.go b/internal/media/thumbnail.go index 36ef24a01..a562dc2ad 100644 --- a/internal/media/thumbnail.go +++ b/internal/media/thumbnail.go @@ -34,6 +34,40 @@ import ( "golang.org/x/image/webp" ) +const ( + maxThumbWidth = 512 + maxThumbHeight = 512 +) + +// thumbSize returns the dimensions to use for an input +// image of given width / height, for its outgoing thumbnail. +// This attempts to maintains the original image aspect ratio. +func thumbSize(width, height int, aspect float32) (int, int) { + + switch { + // Simplest case, within bounds! + case width < maxThumbWidth && + height < maxThumbHeight: + return width, height + + // Width is larger side. + case width > height: + // i.e. height = newWidth * (height / width) + height = int(float32(maxThumbWidth) / aspect) + return maxThumbWidth, height + + // Height is larger side. + case height > width: + // i.e. width = newHeight * (width / height) + width = int(float32(maxThumbHeight) * aspect) + return width, maxThumbHeight + + // Square. + default: + return maxThumbWidth, maxThumbHeight + } +} + // generateThumb generates a thumbnail for the // input file at path, resizing it to the given // dimensions and generating a blurhash if needed. @@ -229,11 +263,17 @@ func generateNativeThumb( img = imaging.Transverse(img) } - // Resize image to dimens. - img = imaging.Resize(img, - width, height, - imaging.Linear, - ) + // Resize image to dimens only if necessary. + if img.Bounds().Dx() > maxThumbWidth || + img.Bounds().Dy() > maxThumbHeight { + // Note: We could call "imaging.Fit" here + // but there's no point, as we've already + // calculated target dimensions beforehand. + img = imaging.Resize(img, + width, height, + imaging.Linear, + ) + } // Open output file at given path. outfile, err := os.Create(outpath) @@ -255,7 +295,7 @@ func generateNativeThumb( if needBlurhash { // for generating blurhashes, it's more cost effective to // lose detail since it's blurry, so make a tiny version. - tiny := imaging.Resize(img, 64, 64, imaging.NearestNeighbor) + tiny := imaging.Resize(img, 32, 0, imaging.NearestNeighbor) // Drop the larger image // ref as soon as possible @@ -294,7 +334,7 @@ func generateWebpBlurhash(filepath string) (string, error) { // for generating blurhashes, it's more cost effective to // lose detail since it's blurry, so make a tiny version. - tiny := imaging.Resize(img, 64, 64, imaging.NearestNeighbor) + tiny := imaging.Resize(img, 32, 0, imaging.NearestNeighbor) // Drop the larger image // ref as soon as possible diff --git a/internal/media/util.go b/internal/media/util.go index 17d396a0b..f743e3821 100644 --- a/internal/media/util.go +++ b/internal/media/util.go @@ -39,39 +39,6 @@ func getExtension(path string) string { return "" } -// thumbSize returns the dimensions to use for an input -// image of given width / height, for its outgoing thumbnail. -// This attempts to maintains the original image aspect ratio. -func thumbSize(width, height int, aspect float32) (int, int) { - const ( - maxThumbWidth = 512 - maxThumbHeight = 512 - ) - - switch { - // Simplest case, within bounds! - case width < maxThumbWidth && - height < maxThumbHeight: - return width, height - - // Width is larger side. - case width > height: - // i.e. height = newWidth * (height / width) - height = int(float32(maxThumbWidth) / aspect) - return maxThumbWidth, height - - // Height is larger side. - case height > width: - // i.e. width = newHeight * (width / height) - width = int(float32(maxThumbHeight) * aspect) - return width, maxThumbHeight - - // Square. - default: - return maxThumbWidth, maxThumbHeight - } -} - // getMimeType returns a suitable mimetype for file extension. func getMimeType(ext string) string { const defaultType = "application/octet-stream" diff --git a/testrig/media/thoughtsofdog-small.jpeg b/testrig/media/thoughtsofdog-small.jpeg index 911565a719e88c524b8802304109fa3c8746ebd4..35c8f7e98ea9fade74eabef279e89dc1bc5efdd4 100644 GIT binary patch delta 18445 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