From ca9fb6c586048f2ceb55235f802591d10aa57349 Mon Sep 17 00:00:00 2001 From: DarthSim Date: Wed, 4 Jan 2023 00:21:57 +0300 Subject: [PATCH] Optimize memory usage in some scenarios --- CHANGELOG.md | 1 + processing/processing.go | 6 +-- processing/rotate_and_flip.go | 8 ++++ processing/scale.go | 18 +++++---- processing/{finalize.go => strip_metadata.go} | 40 ++++++++++--------- processing/watermark.go | 5 --- 6 files changed, 41 insertions(+), 37 deletions(-) rename processing/{finalize.go => strip_metadata.go} (79%) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb68bacb..d6531d6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] ### Change - Add support for Managed Identity or Service Principal credentials to Azure Blob Storage integration. +- Optimize memory usage in some scenarios. ### Fix - Fix craches in some cases when using OpenTelemetry in Amazon ECS. diff --git a/processing/processing.go b/processing/processing.go index 7cfc985d..a05cca57 100644 --- a/processing/processing.go +++ b/processing/processing.go @@ -35,7 +35,7 @@ var mainPipeline = pipeline{ flatten, watermark, exportColorProfile, - finalize, + stripMetadata, } func isImageTypePreferred(imgtype imagetype.Type) bool { @@ -182,10 +182,6 @@ func transformAnimated(ctx context.Context, img *vips.Image, po *options.Process return err } - if err = img.CopyMemory(); err != nil { - return err - } - if len(delay) == 0 { delay = make([]int, framesCount) for i := range delay { diff --git a/processing/rotate_and_flip.go b/processing/rotate_and_flip.go index 66b30131..9fb5ee7e 100644 --- a/processing/rotate_and_flip.go +++ b/processing/rotate_and_flip.go @@ -7,6 +7,14 @@ import ( ) func rotateAndFlip(pctx *pipelineContext, img *vips.Image, po *options.ProcessingOptions, imgdata *imagedata.ImageData) error { + if pctx.angle%360 == 0 && po.Rotate%360 == 0 && !pctx.flip { + return nil + } + + if err := img.CopyMemory(); err != nil { + return err + } + if err := img.Rotate(pctx.angle); err != nil { return err } diff --git a/processing/scale.go b/processing/scale.go index 6fa245ef..07ac3cc3 100644 --- a/processing/scale.go +++ b/processing/scale.go @@ -7,15 +7,17 @@ import ( ) func scale(pctx *pipelineContext, img *vips.Image, po *options.ProcessingOptions, imgdata *imagedata.ImageData) error { - if pctx.wscale != 1 || pctx.hscale != 1 { - wscale, hscale := pctx.wscale, pctx.hscale - if (pctx.angle+po.Rotate)%180 == 90 { - wscale, hscale = hscale, wscale - } + if pctx.wscale == 1 && pctx.hscale == 1 { + return nil + } - if err := img.Resize(wscale, hscale); err != nil { - return err - } + wscale, hscale := pctx.wscale, pctx.hscale + if (pctx.angle+po.Rotate)%180 == 90 { + wscale, hscale = hscale, wscale + } + + if err := img.Resize(wscale, hscale); err != nil { + return err } return img.CopyMemory() diff --git a/processing/finalize.go b/processing/strip_metadata.go similarity index 79% rename from processing/finalize.go rename to processing/strip_metadata.go index c2f11229..a30f0541 100644 --- a/processing/finalize.go +++ b/processing/strip_metadata.go @@ -92,29 +92,31 @@ func stripXMP(img *vips.Image) []byte { return xmpData } -func finalize(pctx *pipelineContext, img *vips.Image, po *options.ProcessingOptions, imgdata *imagedata.ImageData) error { - if po.StripMetadata { - var iptcData, xmpData []byte +func stripMetadata(pctx *pipelineContext, img *vips.Image, po *options.ProcessingOptions, imgdata *imagedata.ImageData) error { + if !po.StripMetadata { + return nil + } - if po.KeepCopyright { - iptcData = stripIPTC(img) - xmpData = stripXMP(img) + var iptcData, xmpData []byte + + if po.KeepCopyright { + iptcData = stripIPTC(img) + xmpData = stripXMP(img) + } + + if err := img.Strip(po.KeepCopyright); err != nil { + return err + } + + if po.KeepCopyright { + if len(iptcData) > 0 { + img.SetBlob("iptc-data", iptcData) } - if err := img.Strip(po.KeepCopyright); err != nil { - return err - } - - if po.KeepCopyright { - if len(iptcData) > 0 { - img.SetBlob("iptc-data", iptcData) - } - - if len(xmpData) > 0 { - img.SetBlob("xmp-data", xmpData) - } + if len(xmpData) > 0 { + img.SetBlob("xmp-data", xmpData) } } - return img.CopyMemory() + return nil } diff --git a/processing/watermark.go b/processing/watermark.go index b6ace659..10bcc5a8 100644 --- a/processing/watermark.go +++ b/processing/watermark.go @@ -17,7 +17,6 @@ var watermarkPipeline = pipeline{ scale, rotateAndFlip, padding, - finalize, } func prepareWatermark(wm *vips.Image, wmData *imagedata.ImageData, opts *options.WatermarkOptions, imgWidth, imgHeight int) error { @@ -62,10 +61,6 @@ func applyWatermark(img *vips.Image, wmData *imagedata.ImageData, opts *options. return err } - if err := img.CopyMemory(); err != nil { - return err - } - wm := new(vips.Image) defer wm.Clear()