使用 MVC2 从 SQL 数据库动态调整映像大小



我有一个简单的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 但它似乎想将图像存储在我想避免的服务器上。是否可以即时执行此操作..?

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

感谢您的任何指示!

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

您将使用的方法是:

ImageResizer.ImageBuilder.Current.Build(对象源、对象目标、调整大小设置设置)

我修改了您的方法以这种方式进行,但它未经测试。希望对您有所帮助。

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

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

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

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

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

最新更新