使用MVC2动态调整SQL数据库的大小

时间:2012-05-07 14:56:45

标签: c# sql asp.net-mvc-2 image-scaling imageresizer

我有一个简单的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,但似乎想要将图像存储在我想要避免的服务器上。是否有可能在飞行中做到这一点..?

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

感谢您的任何指示!

3 个答案:

答案 0 :(得分:11)

ImageResizer.NET允许您将流传递给它以进行大小调整,请参阅Managed API usage

您使用的方法是:

ImageResizer.ImageBuilder.Current.Build(对象源,对象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;
    }

答案 1 :(得分:4)

最近在Image Resizing播放了Hanselminutes播客,Nathanael Jones讨论了图片大小调整的一些陷阱。

即使您没有30分钟的时间来收听完整的播客,节目笔记也会指向一些有趣的resizing pitfalls,以及由Nathanael Jones编写的调整大小library的图像。< / p>

答案 2 :(得分: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");
    }
}