/// <summary>
/// System.Drawing.Image Extender
/// </summary>
public static class ImageExtender
{
/// <summary>
/// Resize the given image to the targetSize using the given interpolation mode
/// Keeps the existing aspect ratio of the image
/// </summary>
/// <param name="srcImage"></param>
/// <param name="targetSize"></param>
/// <param name="im"></param>
/// <returns></returns>
public static Image ResizeImage(this Image srcImage, Size targetSize, InterpolationMode im)
{
Rectangle srcRect = new Rectangle(0, 0, srcImage.Width, srcImage.Height);
Size sizeToFit = CalcSizeToFit(srcImage.Size, targetSize);
Rectangle destRect = new Rectangle(0, 0, sizeToFit.Width, sizeToFit.Height);
Bitmap resizedImage = new Bitmap(sizeToFit.Width, sizeToFit.Height, PixelFormat.Format24bppRgb);
resizedImage.SetResolution(srcImage.HorizontalResolution, srcImage.VerticalResolution);
Graphics imageAsCanvas = Graphics.FromImage(resizedImage);
imageAsCanvas.Clear(Color.White);
//imageAsCanvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
imageAsCanvas.InterpolationMode = im;
imageAsCanvas.DrawImage(srcImage,
destRect,
srcRect,
GraphicsUnit.Pixel);
imageAsCanvas.Dispose();
return resizedImage;
}
/// <summary>
/// Resize the given image to the targetSize using bicubic interpolation
/// Keeps the existing aspect ratio of the image
/// </summary>
/// <param name="srcImage"></param>
/// <param name="targetSize"></param>
/// <param name="im"></param>
/// <returns></returns>
public static Image ResizeImageHighQuality(this Image srcImage, Size targetSize)
{
Rectangle srcRect = new Rectangle(0, 0, srcImage.Width, srcImage.Height);
Size sizeToFit = CalcSizeToFit(srcImage.Size, targetSize);
Rectangle destRect = new Rectangle(0, 0, sizeToFit.Width, sizeToFit.Height);
Bitmap resizedImage = new Bitmap(sizeToFit.Width, sizeToFit.Height,
PixelFormat.Format24bppRgb);
resizedImage.SetResolution(srcImage.HorizontalResolution,
srcImage.VerticalResolution);
using (Graphics imageAsCanvas = Graphics.FromImage(resizedImage))
{
imageAsCanvas.Clear(Color.White);
imageAsCanvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
imageAsCanvas.DrawImage(srcImage,
destRect,
srcRect,
GraphicsUnit.Pixel);
}
return resizedImage;
}
/// <summary>
/// Calculate the best fit of the source size to the target
/// size that maintains the aspect ratio
/// </summary>
/// <param name="src"></param>
/// <param name="target"></param>
/// <returns></returns>
static public Size CalcSizeToFit(Size src, Size target)
{
float sfh = (float)target.Height / (float)src.Height;
float sfw = (float)target.Width / (float)src.Width;
float sf = Math.Min(sfh, sfw);
Size sizeToFit = new Size((int)Math.Round((double)src.Width * sf),
(int)Math.Round((double)src.Height * sf));
return sizeToFit;
}
}
February 6, 2009
System.Drawing.Image Extension Class
Adds simple methods for redrawing images with a given interpolation mode whilst maintaining the aspect ratio.
February 5, 2009
Using Application Commands
These are standard application related commands, see here
In Xaml:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Close"
Executed="CloseCommandHandler"
CanExecute="CanExecuteHandler"
/>
</Window.CommandBindings>
...
<Button Command="ApplicationCommands.Close"
Content="Close File" />
and in code:
// Executed event handler.
private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
// Calls a method to close the file and release resources.
CloseFile();
}
// CanExecute event handler.
private void CanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
// Call a method to determine if there is a file open.
// If there is a file open, then set CanExecute to true.
if (IsFileOpened())
{
e.CanExecute = true;
}
// if there is not a file open, then set CanExecute to false.
else
{
e.CanExecute = false;
}
}
Subscribe to:
Comments (Atom)