I wrote a c# class for a personal project, and I'm sure it will be useful for you to. Very often we need to quickly resize an UIImage, using Thumb Resize maintaining aspect ratio or Crop Resize...
A quick example to crop and resize an image from 768x507 to 300x300:
//load a test image, with size: 768x507
UIImage img = UIImage.FromFile("test.jpg");
//initiate the resizer class
ImageResizer resizer = new ImageResizer(img);
//crop resize
resizer.CropResize( 300,300 );
//and that's it! The image is resized & croped to exactly 300x300
UIImage croppedImage = resizer.ModifiedImage;
Or resize maintaining ratio to a maximum of 200x200:
//load a test image, with size: 768x507
UIImage img = UIImage.FromFile("test.jpg");
//initiate the resizer class
ImageResizer resizer = new ImageResizer(img);
//crop resize
resizer.RatioResize( 200,200 ); //now it has 200x132
//and that's it!
UIImage croppedImage = resizer.ModifiedImage;
Also you can scale it to 120% for example
//load a test image, with size: 768x507
UIImage img = UIImage.FromFile("test.jpg");
//initiate the resizer class
ImageResizer resizer = new ImageResizer(img);
//crop resize
resizer.Scale( 120 ); //now it has 922x608
//and that's it!
UIImage croppedImage = resizer.ModifiedImage;
So, here it is!
using System;
using MonoTouch.UIKit;
using System.Drawing;
using MonoTouch.CoreGraphics;
namespace Test
{
public enum CropPosition
{
Start, Center, End
}
public class ImageResizer
{
UIImage initialImage = null;
UIImage modifiedImage = null;
public ImageResizer ( UIImage image )
{
this.initialImage = image;
this.modifiedImage = image;
}
/// <summary>
/// strech resize
/// </summary>
public void Resize( float width, float height )
{
UIGraphics.BeginImageContext( new SizeF( width, height ) );
//
modifiedImage.Draw( new RectangleF( 0,0, width, height ) );
modifiedImage = UIGraphics.GetImageFromCurrentImageContext();
//
UIGraphics.EndImageContext();
}
public void RatioResizeToWidth( float width )
{
Console.WriteLine("resize to width: " + width );
var cur_width = modifiedImage.Size.Width;
if( cur_width > width )
{
var ratio = width / cur_width;
var height = modifiedImage.Size.Height * ratio;
//resize
Resize( width, height );
}
}
public void RatioResizeToHeight( float height )
{
Console.WriteLine("resize to height: " + height );
var cur_height = modifiedImage.Size.Height;
if( cur_height > height )
{
var ratio = height / cur_height;
var width = modifiedImage.Size.Width * ratio;
//
Resize( width, height );
}
}
/// <summary>
/// resize maintaining ratio
/// </summary>
public void RatioResize( float max_width, float max_height )
{
if( max_width > max_height )
{
RatioResizeToWidth ( max_width );
RatioResizeToHeight( max_height );
}
else
{
RatioResizeToHeight( max_height );
RatioResizeToWidth ( max_width );
}
}
/// <summary>
/// scaling the image with a given procent value
/// </summary>
public void Scale( float procent )
{
var width = modifiedImage.Size.Width * (procent / 100);
var height = modifiedImage.Size.Height * (procent / 100);
Resize( width, height );
}
/// <summary>
/// default crop resize, set on center
/// </summary>
public void CropResize( float width, float height )
{
CropResize(width, height, CropPosition.Center );
}
/// <summary>
/// resize and crop to a specific location
/// </summary>
public void CropResize( float width, float height, CropPosition position )
{
SizeF ImgSize = modifiedImage.Size;
//
if( ImgSize.Width < width ) width = ImgSize.Width;
if( ImgSize.Height < height ) height = ImgSize.Height;
//
float crop_x = 0;
float crop_y = 0;
if( ImgSize.Width / width < ImgSize.Height / height )
{
//scad din width
RatioResizeToWidth( width );
ImgSize = modifiedImage.Size;
//compute crop_y
if( position == CropPosition.Center ) crop_y = (ImgSize.Height / 2) - (height / 2);
if( position == CropPosition.End ) crop_y = ImgSize.Height - height;
}
else
{
//change height
RatioResizeToHeight( height );
ImgSize = modifiedImage.Size;
//calculeaza crop_x
if( position == CropPosition.Center ) crop_x = (ImgSize.Width / 2) - (width / 2);
if( position == CropPosition.End ) crop_x = ImgSize.Width - width;
}
//create new contect
UIGraphics.BeginImageContext( new SizeF( width, height ) );
CGContext context = UIGraphics.GetCurrentContext();
//crops the new context to the desired height and width
RectangleF clippedRect = new RectangleF( 0, 0, width, height );
context.ClipToRect(clippedRect);
//draw my image on the context
RectangleF drawRect = new RectangleF( -crop_x, -crop_y, ImgSize.Width, ImgSize.Height );
modifiedImage.Draw( drawRect );
//save the context in modifiedImage
modifiedImage = UIGraphics.GetImageFromCurrentImageContext();
//close the context
UIGraphics.EndImageContext();
}
public UIImage InitialImage
{
get
{
return this.initialImage;
}
}
public UIImage ModifiedImage
{
get
{
return this.modifiedImage;
}
}
}
}
