2012-05-07 3 views
4

У меня есть простое приложение MVC2, которое загружает файл из браузера в базу данных MS SQL в виде изображения.Изменение размера из базы данных SQL на лету с MVC2

Тогда я могу вернуть результаты что-то вроде:

 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, но мне кажется, что я хочу сохранить изображения на своем сервере, которых я хочу избежать. Можно ли это сделать на лету ..?

Мне нужно сохранить исходный файл и не по возможности хранить изображения в виде файлов на сервере.

Спасибо за любые указатели!

+0

Ничего себе! Оба ответа ниже работают блестяще. Я не знаю, что делать теперь с отметкой, как было сказано, так как я был бы над луной только с одним из этих ответов :) – beebul

ответ

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

Я выбираю это как ответ, потому что Я уже использовал ImageResizer. Благодаря! – beebul

+0

На самом деле, 'inStream' не требуется, ImageResizer может напрямую использовать массив byte []. Кроме того, если вы не хотите кэшировать диск по определенным запросам, вы можете добавить & cache = no вместо создания менее эффективного результата MVC ... –

+0

@ComputerLinguist, этот метод, похоже, не использует DiskCaching. Есть ли пример где-то, где показан массив байтов, преобразованный выше, но используя кеширование диска? – vernak2539

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

Спасибо Дарин, это было полезно :) David – beebul

4

Был недавно Hanselminutes подкаста на Image Resizing с Натаниэль Джонс обсуждает некоторые из ловушек изменения размера изображения.

Даже если у вас нет 30 минут, чтобы прослушать полный подкаст, заметки показывают, что некоторые интересные resizing pitfalls, а также изображение, изменяющее размер library также написанное Nathanael Jones.

+0

Спасибо, Джек, я обязательно это проверю. – beebul

Смежные вопросы