图形对象到图像文件

nia*_*her 9 c# asp.net system.drawing

我想裁剪并调整图像大小.这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

现在我假设我生成的裁剪/调整大小的图像存储在图形对象中.问题是 - 如何将其保存到文件中?

Fre*_*örk 11

Graphics您获得的对象Graphics.FromImage是图像的绘图表面.因此,您可以在完成后保存图像对象.

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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,尽管在jpg图像上重复这样做可能不是一件好事; 每次重新编码图像,由于jpg使用破坏性压缩方法,每次都会丢失一些图像质量.如果这是一次一次的图像操作,我不担心.


Guf*_*ffa 5

不,该Graphics对象不包含任何图像数据,它用于在画布上绘制,通常是画面或Bitmap对象.

因此,您需要创建一个Bitmap具有正确大小的对象来绘制,并Graphics为该位图创建对象.然后你可以保存它.请记住,IDisposable应该处理对象实现,例如使用以下using子句:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)