/// <summary> /// Resizes an image to the given width and height with the given sampler and /// source rectangle. /// </summary> /// <typeparam name="TColor">The pixel format.</typeparam> /// <typeparam name="TPacked">The packed format. <example>uint, long, float.</example></typeparam> /// <param name="source">The image to resize.</param> /// <param name="width">The target image width.</param> /// <param name="height">The target image height.</param> /// <param name="sampler">The <see cref="IResampler"/> to perform the resampling.</param> /// <param name="sourceRectangle"> /// The <see cref="Rectangle"/> structure that specifies the portion of the image object to draw. /// </param> /// <param name="targetRectangle"> /// The <see cref="Rectangle"/> structure that specifies the portion of the target image object to draw to. /// </param> /// <param name="compand">Whether to compress and expand the image color-space to gamma correct the image during processing.</param> /// <returns>The <see cref="Image{TColor, TPacked}"/></returns> /// <remarks>Passing zero for one of height or width will automatically preserve the aspect ratio of the original image</remarks> public static Image <TColor, TPacked> Resize <TColor, TPacked>(this Image <TColor, TPacked> source, int width, int height, IResampler sampler, Rectangle sourceRectangle, Rectangle targetRectangle, bool compand = false) where TColor : struct, IPackedPixel <TPacked> where TPacked : struct, IEquatable <TPacked> { if (width == 0 && height > 0) { width = source.Width * height / source.Height; targetRectangle.Width = width; } if (height == 0 && width > 0) { height = source.Height * width / source.Width; targetRectangle.Height = height; } Guard.MustBeGreaterThan(width, 0, nameof(width)); Guard.MustBeGreaterThan(height, 0, nameof(height)); ResamplingWeightedProcessor <TColor, TPacked> processor; if (compand) { processor = new CompandingResizeProcessor <TColor, TPacked>(sampler, width, height, targetRectangle); } else { processor = new ResizeProcessor <TColor, TPacked>(sampler, width, height, targetRectangle); } return(source.Process(sourceRectangle, processor)); }
/// <summary> /// Resizes an image to the given width and height with the given sampler and /// source rectangle. /// </summary> /// <typeparam name="T">The pixel format.</typeparam> /// <typeparam name="TP">The packed format. <example>long, float.</example></typeparam> /// <param name="source">The image to resize.</param> /// <param name="width">The target image width.</param> /// <param name="height">The target image height.</param> /// <param name="sampler">The <see cref="IResampler"/> to perform the resampling.</param> /// <param name="sourceRectangle"> /// The <see cref="Rectangle"/> structure that specifies the portion of the image object to draw. /// </param> /// <param name="targetRectangle"> /// The <see cref="Rectangle"/> structure that specifies the portion of the target image object to draw to. /// </param> /// <param name="compand">Whether to compress and expand the image color-space to gamma correct the image during processing.</param> /// <param name="progressHandler">A delegate which is called as progress is made processing the image.</param> /// <returns>The <see cref="Image{T,TP}"/></returns> /// <remarks>Passing zero for one of height or width will automatically preserve the aspect ratio of the original image</remarks> public static Image <T, TP> Resize <T, TP>(this Image <T, TP> source, int width, int height, IResampler sampler, Rectangle sourceRectangle, Rectangle targetRectangle, bool compand = false, ProgressEventHandler progressHandler = null) where T : IPackedVector <TP> where TP : struct { if (width == 0 && height > 0) { width = source.Width * height / source.Height; targetRectangle.Width = width; } if (height == 0 && width > 0) { height = source.Height * width / source.Width; targetRectangle.Height = height; } Guard.MustBeGreaterThan(width, 0, nameof(width)); Guard.MustBeGreaterThan(height, 0, nameof(height)); ResamplingWeightedProcessor <T, TP> processor; if (compand) { processor = new CompandingResizeProcessor <T, TP>(sampler); } else { processor = new ResizeProcessor <T, TP>(sampler); } processor.OnProgress += progressHandler; try { return(source.Process(width, height, sourceRectangle, targetRectangle, processor)); } finally { processor.OnProgress -= progressHandler; } }