Simple Image Resizer Tools - C# Example
This example will use the Image Resizer Class from previous post. I have change a little bit on the class so that i can use it for my example image resizer tools.
Have a try ..Do PM me in Google+ to share the project.
By Mohd Zulkamal
NOTE : – If You have Found this post Helpful, I will appreciate if you can Share it on Facebook, Twitter and Other Social Media Sites. Thanks =)
ImageResizer Tool Requirement
- ImageResizer tool will require user to choose the image to resize.
- Only JPG image supported.
- After that user can simply put the width and height to change the selected image width and height.
- User can choose is either to use aspect ratio.
- After Complete , user will prompt to open the new image after resize.
- The tools use .NET version 4.
The GUI of ImageResizer Tool
The Code Behind
private string _ImageName;
private string _ImageExtension;
public Form1()
{
InitializeComponent();
TPercentage.Text = "0";
tWidth.Text = "0";
THeight.Text = "0";
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "JPEG Files (.JPG)|*.JPG";
openFileDialog1.FilterIndex = 1;
openFileDialog1.Multiselect = false;
// Call the ShowDialog method to show the dialog box.
DialogResult Dr = openFileDialog1.ShowDialog();
// Process input if the user clicked OK.
if (Dr.ToString().Equals("OK",StringComparison.CurrentCultureIgnoreCase))
{
TSelectImage.Text = openFileDialog1.FileName;
_ImageName = (openFileDialog1.FileName.Split('\\'))[openFileDialog1.FileName.Split('\\').Length - 1];
_ImageExtension = _ImageName.Substring(_ImageName.Length - 4);
loadImage();
}
}
protected void loadImage(string filename = "")
{
panel1.Visible = true;
pictureBox1.WaitOnLoad = false;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
if(filename == "")
pictureBox1.LoadAsync(openFileDialog1.FileName);
pictureBox1.LoadCompleted += new AsyncCompletedEventHandler(pictureBox1_LoadCompleted);
}
void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e)
{
//label3.Text = pictureBox1.Image.Width.ToString();
//label5.Text = pictureBox1.Image.Height.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
string reSizeImageName = _ImageName + "_Resize" + _ImageExtension;
long width = Convert.ToInt64(tWidth.Text);
long height = Convert.ToInt64(THeight.Text);
double percentageRatio = Convert.ToDouble(TPercentage.Text);
AGAIN:
ImageResizer.ResizeImage(pictureBox1.ImageLocation, Directory.GetCurrentDirectory() + "\\" + reSizeImageName,
100,percentageRatio,width,height,checkBox1.Checked);
if (ImageResizer.Status == 1)
goto AGAIN;//this is because method need to run in async which is not supported in .NET 4 ..only support .NET 4.5 currently
DialogResult dr = MessageBox.Show("Resize succes, open file in an external viewer?", "Open File", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + "\\" + reSizeImageName);
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
label2.Visible = false;
label3.Visible = false;
tWidth.Visible = false;
label4.Visible = false;
label5.Visible = false;
THeight.Visible = false;
label6.Visible = true;
TPercentage.Visible = true;
label7.Visible = true;
TPercentage.Text = "0";
tWidth.Text = "0";
THeight.Text = "0";
}
else
{
label2.Visible = true;
label3.Visible = true;
tWidth.Visible = true;
label4.Visible = true;
label5.Visible = true;
THeight.Visible = true;
label6.Visible = false;
TPercentage.Visible = false;
label7.Visible = false;
tWidth.Text = "0";
THeight.Text = "0";
TPercentage.Text = "0";
}
}
private void TPercentage_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
}
The Modified ImageResizer Class
class ImageResizer
{
private static ImageCodecInfo jpgEncoder;
private static int _status;
public static int Status
{
get { return ImageResizer._status; }
set { ImageResizer._status = value; }
}
/// <summary>
/// Method to resize JPEG and GIF Image
/// </summary>
/// <param name="inFile">input file location</param>
/// <param name="outFile">output file location</param>
/// <param name="level"> level of compression between 0 and 100, with 0 being maximum compression and minimum size and
/// with 100 being minimum compression and maximum size.(For JPEG Only)</param>
/// <param name="maxDimension">percentage ratio</param>
/// <param name="newWidth">width of new image</param>
/// <param name="newHeight">height of new image</param>
/// <param name="useAspectRatio">true | false</param>
public static void ResizeImage(string inFile, string outFile, long level,double maxDimension = 0, long newWidth = 0, long newHeight = 0,bool useAspectRatio = false)
{
byte[] buffer;
using (Stream stream = new FileStream(inFile, FileMode.Open))
{
buffer = new byte[stream.Length];
Task<int>.Factory.FromAsync(stream.BeginRead, stream.EndRead, buffer, 0, buffer.Length, null);
}
try
{
using (MemoryStream memStream = new MemoryStream(buffer))
{
using (Image inImage = Image.FromStream(memStream))
{
double width = 0;
double height = 0;
if (newWidth > 0)
width = Convert.ToDouble(newWidth);
if (newHeight > 0)
height = Convert.ToDouble(newHeight);
if (useAspectRatio)
{
width = inImage.Width * (maxDimension / 100);
height = inImage.Height * (maxDimension / 100);
}
using (Bitmap bitmap = new Bitmap((int)width, (int)height))
{
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(inImage, 0, 0, bitmap.Width, bitmap.Height);
if (inImage.RawFormat.Guid == ImageFormat.Jpeg.Guid)
{
if (jpgEncoder == null)
{
ImageCodecInfo[] ici = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo info in ici)
{
if (info.FormatID == ImageFormat.Jpeg.Guid)
{
jpgEncoder = info;
break;
}
}
}
if (jpgEncoder != null)
{
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(Encoder.Quality, level);
bitmap.Save(outFile, jpgEncoder, ep);
}
else
{
bitmap.Save(outFile, inImage.RawFormat);
}
}
else
{
//
// Fill with white for transparent GIFs
//
graphics.FillRectangle(Brushes.White, 0, 0, bitmap.Width, bitmap.Height);
bitmap.Save(outFile, inImage.RawFormat);
}
Status = 0;
}
}
}
}
}
catch (ArgumentException arg)
{
if (arg.Message.Equals("Parameter is Not Valid.", StringComparison.CurrentCultureIgnoreCase))
Status = 1;
else
MessageBox.Show(arg.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "." + Environment.NewLine + "Please Try Again");
}
}
}
Have a try ..Do PM me in Google+ to share the project.
By Mohd Zulkamal
NOTE : – If You have Found this post Helpful, I will appreciate if you can Share it on Facebook, Twitter and Other Social Media Sites. Thanks =)