Prechádzať zdrojové kódy

Fix and optimize processing of animated images

DarthSim 5 rokov pred
rodič
commit
721c3a8b2c
2 zmenil súbory, kde vykonal 23 pridanie a 17 odobranie
  1. 2 0
      CHANGELOG.md
  2. 21 17
      process.go

+ 2 - 0
CHANGELOG.md

@@ -1,6 +1,8 @@
 # Changelog
 
 ## [Unreleased]
+### Fixed
+- Fix and optimize processing of animated images.
 
 ## [2.13.0] - 2020-04-22
 ### Added

+ 21 - 17
process.go

@@ -538,33 +538,37 @@ func transformAnimated(ctx context.Context, img *vipsImage, data []byte, po *pro
 		return err
 	}
 
-	frames := make([]*vipsImage, framesCount)
-	defer func() {
-		for _, frame := range frames {
-			frame.Clear()
-		}
-	}()
-
 	watermarkEnabled := po.Watermark.Enabled
 	po.Watermark.Enabled = false
 	defer func() { po.Watermark.Enabled = watermarkEnabled }()
 
 	var errg panicGroup
 
-	for i := 0; i < framesCount; i++ {
-		ind := i
-		errg.Go(func() error {
-			frames[ind] = new(vipsImage)
+	frames := make([]*vipsImage, framesCount)
+	defer func() {
+		// Ensure all frames are processed before freeing
+		errg.Wait()
 
-			if ferr := img.Extract(frames[ind], 0, ind*frameHeight, imgWidth, frameHeight); ferr != nil {
-				return ferr
+		for _, frame := range frames {
+			if frame != nil {
+				frame.Clear()
 			}
+		}
+	}()
 
-			if ferr := transformImage(ctx, frames[ind], nil, po, imgtype); ferr != nil {
-				return ferr
-			}
+	for i := 0; i < framesCount; i++ {
+		frame := new(vipsImage)
+
+		if err = img.Extract(frame, 0, i*frameHeight, imgWidth, frameHeight); err != nil {
+			return err
+		}
+
+		frame.CopyMemory()
 
-			return nil
+		frames[i] = frame
+
+		errg.Go(func() error {
+			return transformImage(ctx, frame, nil, po, imgtype)
 		})
 	}