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 @@ "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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