// // Copyright (c) James Jackson-South and contributors. // Licensed under the Apache License, Version 2.0. // namespace ImageProcessor.Samplers { /// /// Extensions methods for to apply samplers to the image. /// public static class ImageSampleExtensions { /// /// Crops an image to the given width and height. /// /// The image to resize. /// The target image width. /// The target image height. /// A delegate which is called as progress is made processing the image. /// The public static Image Crop(this Image source, int width, int height, ProgressEventHandler progressHandler = null) { return Crop(source, width, height, source.Bounds, progressHandler); } /// /// Crops an image to the given width and height with the given source rectangle. /// /// If the source rectangle is smaller than the target dimensions then the /// area within the source is resized performing a zoomed crop. /// /// /// The image to crop. /// The target image width. /// The target image height. /// /// The structure that specifies the portion of the image object to draw. /// /// A delegate which is called as progress is made processing the image. /// The public static Image Crop(this Image source, int width, int height, Rectangle sourceRectangle, ProgressEventHandler progressHandler = null) { if (sourceRectangle.Width < width || sourceRectangle.Height < height) { // If the source rectangle is smaller than the target perform a // cropped zoom. source = source.Resize(sourceRectangle.Width, sourceRectangle.Height); } Crop processor = new Crop(); processor.OnProgress += progressHandler; try { return source.Process(width, height, sourceRectangle, new Rectangle(0, 0, width, height), processor); } finally { processor.OnProgress -= progressHandler; } } /// /// Crops an image to the area of greatest entropy. /// /// The image to crop. /// The threshold for entropic density. /// A delegate which is called as progress is made processing the image. /// The public static Image EntropyCrop(this Image source, float threshold = .5f, ProgressEventHandler progressHandler = null) { EntropyCrop processor = new EntropyCrop(threshold); processor.OnProgress += progressHandler; try { return source.Process(source.Width, source.Height, source.Bounds, source.Bounds, processor); } finally { processor.OnProgress -= progressHandler; } } /// /// Resizes an image to the given width and height. /// /// The image to resize. /// The target image width. /// The target image height. /// A delegate which is called as progress is made processing the image. /// The /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image public static Image Resize(this Image source, int width, int height, ProgressEventHandler progressHandler = null) { return Resize(source, width, height, new BicubicResampler(), progressHandler); } /// /// Resizes an image to the given width and height with the given sampler. /// /// The image to resize. /// The target image width. /// The target image height. /// The to perform the resampling. /// A delegate which is called as progress is made processing the image. /// The /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image public static Image Resize(this Image source, int width, int height, IResampler sampler, ProgressEventHandler progressHandler = null) { return Resize(source, width, height, sampler, source.Bounds, progressHandler); } /// /// Resizes an image to the given width and height with the given sampler and /// source rectangle. /// /// The image to resize. /// The target image width. /// The target image height. /// The to perform the resampling. /// /// The structure that specifies the portion of the image object to draw. /// /// A delegate which is called as progress is made processing the image. /// The /// Passing zero for one of height or width will automatically preserve the aspect ratio of the original image public static Image Resize(this Image source, int width, int height, IResampler sampler, Rectangle sourceRectangle, ProgressEventHandler progressHandler = null) { if (width == 0 && height > 0) { width = source.Width * height / source.Height; } if (height == 0 && width > 0) { height = source.Height * width / source.Width; } Resize processor = new Resize(sampler); processor.OnProgress += progressHandler; try { return source.Process(width, height, sourceRectangle, new Rectangle(0, 0, width, height), processor); } finally { processor.OnProgress -= progressHandler; } } /// /// Rotates an image by the given angle in degrees. /// /// The image to resize. /// The angle in degrees to perform the rotation. /// A delegate which is called as progress is made processing the image. /// The public static Image Rotate(this Image source, float degrees, ProgressEventHandler progressHandler = null) { return Rotate(source, degrees, new BicubicResampler(), progressHandler); } /// /// Rotates an image by the given angle in degrees. /// /// The image to resize. /// The angle in degrees to perform the rotation. /// The to perform the resampling. /// A delegate which is called as progress is made processing the image. /// The public static Image Rotate(this Image source, float degrees, IResampler sampler, ProgressEventHandler progressHandler = null) { Rotate processor = new Rotate(sampler) { Angle = degrees }; processor.OnProgress += progressHandler; try { return source.Process(source.Width, source.Height, source.Bounds, source.Bounds, processor); } finally { processor.OnProgress -= progressHandler; } } /// /// Rotates and flips an image by the given instructions. /// /// The image to resize. /// The to perform the rotation. /// The to perform the flip. /// A delegate which is called as progress is made processing the image. /// The public static Image RotateFlip(this Image source, RotateType rotateType, FlipType flipType, ProgressEventHandler progressHandler = null) { RotateFlip processor = new RotateFlip(rotateType, flipType); processor.OnProgress += progressHandler; try { return source.Process(source.Width, source.Height, source.Bounds, source.Bounds, processor); } finally { processor.OnProgress -= progressHandler; } } } }