func (i *Image) sizeFrames(sz *imgry.Sizing) error { // Shortcut if there is nothing to size if sz.Size.Equal(imgry.ZeroRect) && sz.CropBox.Equal(imgry.ZeroFloatingRect) { return nil } // TODO: instead of Coalesce, better to change the offsets. // This is required for animated image resizing if !sz.Flatten && i.mw.GetNumberImages() > 1 { i.mw = i.mw.CoalesceImages() } i.mw.SetFirstIterator() for n := true; n; n = i.mw.NextImage() { pw, ph := int(i.mw.GetImageWidth()), int(i.mw.GetImageHeight()) srcSize := imgry.NewRect(pw, ph) // Initial crop of the source image cropBox, cropOrigin, err := sz.CalcCropBox(srcSize) if err != nil { return err } if cropBox != nil && cropOrigin != nil && !cropBox.Equal(imgry.ZeroRect) { err := i.mw.CropImage(uint(cropBox.Width), uint(cropBox.Height), cropOrigin.X, cropOrigin.Y) if err != nil { return err } srcSize = cropBox i.mw.ResetImagePage("") } // Resize the image resizeRect, cropBox, cropOrigin := sz.CalcResizeRect(srcSize) if resizeRect != nil && !resizeRect.Equal(imgry.ZeroRect) { err := i.mw.ResizeImage(uint(resizeRect.Width), uint(resizeRect.Height), imagick.FILTER_LANCZOS, 1.0) if err != nil { return err } i.mw.ResetImagePage("") } // Perform any final crops from an operation if cropBox != nil && cropOrigin != nil && !cropBox.Equal(imgry.ZeroRect) { err := i.mw.CropImage(uint(cropBox.Width), uint(cropBox.Height), cropOrigin.X, cropOrigin.Y) if err != nil { return err } i.mw.ResetImagePage("") } if sz.Flatten { break } } return nil }
func (i *Image) sizeFrames(sz *imgry.Sizing) error { var canvas *imagick.MagickWand var bg *imagick.PixelWand // Shortcut if there is nothing to size if sz.Size.Equal(imgry.ZeroRect) && sz.CropBox.Equal(imgry.ZeroFloatingRect) { return nil } coalesceAndDeconstruct := !sz.Flatten && i.mw.GetNumberImages() > 1 if coalesceAndDeconstruct { i.mw = i.mw.CoalesceImages() } if sz.Canvas != nil { // If the user requested a canvas. canvas = imagick.NewMagickWand() bg = imagick.NewPixelWand() bg.SetColor("transparent") defer func() { bg.Destroy() if canvas != nil && canvas != i.mw { canvas.Destroy() } }() } i.mw.SetFirstIterator() for n := true; n; n = i.mw.NextImage() { pw, ph := int(i.mw.GetImageWidth()), int(i.mw.GetImageHeight()) srcSize := imgry.NewRect(pw, ph) // Initial crop of the source image cropBox, cropOrigin, err := sz.CalcCropBox(srcSize) if err != nil { return err } if cropBox != nil && cropOrigin != nil && !cropBox.Equal(imgry.ZeroRect) { err := i.mw.CropImage(uint(cropBox.Width), uint(cropBox.Height), cropOrigin.X, cropOrigin.Y) if err != nil { return err } srcSize = cropBox i.mw.ResetImagePage("") } // Resize the image resizeRect, cropBox, cropOrigin := sz.CalcResizeRect(srcSize) if resizeRect != nil && !resizeRect.Equal(imgry.ZeroRect) { err := i.mw.ResizeImage(uint(resizeRect.Width), uint(resizeRect.Height), imagick.FILTER_LANCZOS, 1.0) if err != nil { return err } i.mw.ResetImagePage("") } // Perform any final crops from an operation if cropBox != nil && cropOrigin != nil && !cropBox.Equal(imgry.ZeroRect) { err := i.mw.CropImage(uint(cropBox.Width), uint(cropBox.Height), cropOrigin.X, cropOrigin.Y) if err != nil { return err } i.mw.ResetImagePage("") } // If we have a canvas we put the image at its center. if canvas != nil { canvas.NewImage(uint(sz.Canvas.Width), uint(sz.Canvas.Height), bg) canvas.SetImageBackgroundColor(bg) canvas.SetImageFormat(i.mw.GetImageFormat()) x := (sz.Canvas.Width - int(i.mw.GetImageWidth())) / 2 y := (sz.Canvas.Height - int(i.mw.GetImageHeight())) / 2 canvas.CompositeImage(i.mw, imagick.COMPOSITE_OP_OVER, x, y) canvas.ResetImagePage("") } if sz.Flatten { break } } if canvas != nil { i.mw.Destroy() i.mw = canvas } if coalesceAndDeconstruct { // Compares each frame of the image, removes pixels that are already on the // background and updates offsets accordingly. i.mw = i.mw.DeconstructImages() } return nil }