4

我有一个简单的 MVC2 应用程序,它将文件从浏览器上传到 MS SQL 数据库作为图像 blob。

然后我可以返回结果,例如:

        public FileContentResult ShowPhoto(int id)
        {
           TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
           tempImageUpload = _service.GetImageData(id) ?? null;
           if (tempImageUpload != null)
           {
              byte[] byteArray = tempImageUpload.TempImageData;
              return new FileContentResult (temp, "image/jpeg");
           }
           return null;
        }

但我想将这些图像调整为缩略图和画廊大小的视图。这可以在这个结果中做到吗?我一直在玩很棒的 imageresizer.net,但它似乎想将图像存储在我想要避免的服务器上。是否可以即时执行此操作..?

我需要保留原始文件,如果可能的话,我不想将图像作为文件存储在服务器上。

感谢您的任何指点!

4

3 回答 3

11

ImageResizer.NET 允许您将流传递给它以调整大小,请参阅托管 API 使用

您将使用的方法是:

ImageResizer.ImageBuilder.Current.Build(object source, object dest, ResizeSettings 设置)

我修改了您的方法以这种方式进行,但未经测试。希望能帮助到你。

public FileContentResult ShowPhoto(int id)
    {
       TemporaryImageUpload tempImageUpload = new TemporaryImageUpload();
       tempImageUpload = _service.GetImageData(id) ?? null;
       if (tempImageUpload != null)
       {
          byte[] byteArray = tempImageUpload.TempImageData;
          using(var outStream = new MemoryStream()){
              using(var inStream = new MemoryStream(byteArray)){
                  var settings = new ResizeSettings("maxwidth=200&maxheight=200");
                  ImageResizer.ImageBuilder.Current.Build(inStream, outStream, settings);
                  var outBytes = outStream.ToArray();
                  return new FileContentResult (outBytes, "image/jpeg");
              }
          }
       }
       return null;
    }
于 2012-05-07T15:43:55.230 回答
4

最近有一个关于图像调整大小的 Hanselminutes 播客,Nathanael Jones 讨论了图像调整大小的一些陷阱。

即使您没有 30 多分钟的时间来收听完整的播客,节目说明也指出了一些有趣的调整大小陷阱,以及Nathanael Jones 编写的图像大小调整库。

于 2012-05-07T15:55:35.673 回答
3

您可以即时调整图像的大小:

public void ResizeImage(Stream input, Stream output, int newWidth, int maxHeight)
{
    using (var srcImage = Image.FromStream(input))
    {
        int newHeight = srcImage.Height * newWidth / srcImage.Width;
        if (newHeight > maxHeight)
        {
            newWidth = srcImage.Width * maxHeight / srcImage.Height;
            newHeight = maxHeight;
        }

        using (var newImage = new Bitmap(newWidth, newHeight))
        using (var gr = Graphics.FromImage(newImage))
        {
            gr.SmoothingMode = SmoothingMode.AntiAlias;
            gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
            newImage.Save(output, ImageFormat.Jpeg);
        }
    }
}

然后您可以有 2 个控制器操作(一个显示完整图像大小,一个显示缩略图):

public ActionResult Thumbnail(int id)
{
    var tempImageUpload = new TemporaryImageUpload();
    tempImageUpload = _service.GetImageData(id) ?? null;
    if (tempImageUpload == null)
    {
        return HttpNotFound();
    }

    using (var input = new MemoryStream(tempImageUpload.TempImageData))
    using (var output = new MemoryStream())
    {
        ResizeImage(input, output, 640, 1000);
        return File(output.ToArray(), "image/jpeg");
    }
}
于 2012-05-07T15:32:11.073 回答