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

时间:2012-08-13 10:56:47

标签: c# asp.net-mvc asp.net-mvc-3

  

可能重复:
  How to generate square thumbnail of an image?

我正在尝试将图片保存为缩略图。我怎么能这样做?

这是我的行动控制:

[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);
}

2 个答案:

答案 0 :(得分:2)

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

// 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);
        }
    }
}

答案 1 :(得分:0)

这是C#函数,您可以使用它以任何方式调整图像大小。在您的特定情况下,使其成为特定大小的缩略图。 需要System.Drawing.Imageint 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;
}

希望这会对你有所帮助。