views:

303

answers:

2

I would like to crop and resize my image. Here is my code:

    Image image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg");

    // Crop and resize the image.
    Rectangle destination = new Rectangle(0, 0, 200, 120);
    Graphics graphic = Graphics.FromImage(image);
    graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel);

Now I assume that my resulting cropped/resized image is stored in the graphics object. Question is - how do I save it to a file?

Thanks.

+4  A: 

The Graphics object that you get from Graphics.FromImage is a drawing surface for the image. So you can simply save the image object when you are done.

string fileName = AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg");
using (Image image = Image.FromFile(fileName)
{
    using (Graphics graphic = Graphics.FromImage(image))
    {
        // Crop and resize the image.
        Rectangle destination = new Rectangle(0, 0, 200, 120);
        graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel);
    }
    image.Save(fileName);
}

Beware though that doing this repeatedly on a jpg image may not be a good thing; the image is re-encoded each time and since jpg uses a destructive compression method you will lose some image quality each time. I wouldn't worry about that if this is a once-per-image operation though.

Fredrik Mörk
A: 

No, the Graphics object doesn't contain any image data, it's used to draw on a canvas, which usually is the screen or a Bitmap object.

So, you need to create a Bitmap object with the correct size to draw on, and create the Graphics object for that bitmap. Then you can save it. Remember that object implementing IDisposable should be disposed, for example using the using clause:

using (Image image = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle.jpg")) {

   // Create bitmap
   using (Bitmap newImage = new Bitmap(200, 120)) {

      // Crop and resize the image.
      Rectangle destination = new Rectangle(0, 0, 200, 120);
      using (Graphics graphic = Graphics.FromImage(newImage)) {
         graphic.DrawImage(image, destination, int.Parse(X1.Value), int.Parse(Y1.Value), int.Parse(Width.Value), int.Parse(Height.Value), GraphicsUnit.Pixel);
      }
      newImage.Save(AppDomain.CurrentDomain.BaseDirectory + "Cropper/tests/castle_icon.jpg", ImageFormat.Jpeg);
   }
}
Guffa