C# 如何在MVC3中将图像保存为缩略图

C# 如何在MVC3中将图像保存为缩略图,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,可能重复: 我正在尝试将图像保存为缩略图。我该怎么做 这是我的动作控制: [HttpPost] [ValidateInput(false)] public ActionResult banner_create(banner banner, HttpPostedFileBase file) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/bann

可能重复:

我正在尝试将图像保存为缩略图。我该怎么做

这是我的动作控制:

[HttpPost]
[ValidateInput(false)]
public ActionResult banner_create(banner banner, HttpPostedFileBase file)
{
    var fileName = Path.GetFileName(file.FileName);
    var path = Path.Combine(Server.MapPath("~/banner_image/"), fileName);
    var extension = Path.GetExtension(path);
    file.SaveAs(path);
    banner.banner_image_description = extension;
    banner.banner_image_name = fileName;
    if (ModelState.IsValid)
    {
        db.banner.AddObject(banner);
        db.SaveChanges();
        return RedirectToAction("index");
    }

    return View(banner);
}

下面的代码应该可以正常工作。 我已经添加了一些评论,所以你可以看到发生了什么

// First, we convert an HttpPostedFileBase to an Image
// (Please note that you need to reference System.Drawing.dll)
using (var image = Image.FromStream(httpPostedFileBase.InputStream, true, true))
{
    // Then we create a thumbnail.
    // The simplest way is using Image.GetThumbnailImage:
    using (var thumb = image.GetThumbnailImage(
        thumbWidth,
        thumbHeight,
        () => false,
        IntPtr.Zero))
    {
        // Finally, we encode and save the thumbnail.
        var jpgInfo = ImageCodecInfo.GetImageEncoders()
            .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();

        using (var encParams = new EncoderParameters(1))
        {
            // Your output path
            string outputPath = "...";
            // Image quality (should be in the range [0..100])
            long quality = 90;
            encParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);
            thumb.Save(outputPath, jpgInfo, encParams);
        }
    }
}
这里有一个C#函数,你可以用它来任意调整图像的大小。在您的特定情况下,使其成为特定大小的缩略图。 它需要
System.Drawing.Image
,并使用
int size
来指定其宽度,然后返回
System.Drawing.Image
。 现在,这一个肯定有效,我在我当前的项目中使用它,它很好地完成了工作

public System.Drawing.Image ScaleBySize(System.Drawing.Image imgPhoto, int size)
{
  var logoSize = size;

  float sourceWidth = imgPhoto.Width;
  float sourceHeight = imgPhoto.Height;
  float destHeight;
  float destWidth;
  const int sourceX = 0;
  const int sourceY = 0;
  const int destX = 0;
  const int destY = 0;

  // Resize Image to have the height = logoSize/2 or width = logoSize.
  // Height is greater than width, set Height = logoSize and resize width accordingly
  if (sourceWidth > (2 * sourceHeight))
  {
    destWidth = logoSize;
    destHeight = sourceHeight * logoSize / sourceWidth;
  }
  else
  {
    int h = logoSize / 2;
    destHeight = h;
    destWidth = sourceWidth * h / sourceHeight;
  }
  // Width is greater than height, set Width = logoSize and resize height accordingly

  var bmPhoto = new Bitmap((int)destWidth, (int)destHeight, PixelFormat.Format32bppPArgb);
  bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

        using (Graphics grPhoto = Graphics.FromImage(bmPhoto))
        {
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
            grPhoto.DrawImage(imgPhoto,
                    new Rectangle(destX, destY, (int)destWidth, (int)destHeight),
                    new Rectangle(sourceX, sourceY, (int)sourceWidth, (int)sourceHeight),
                    GraphicsUnit.Pixel);
            grPhoto.Dispose();
        }
  return bmPhoto;
}
希望这能对你有所帮助