2015-08-12 8 views
1

У меня есть простое веб-приложение (ASP.NET MVC 5 C#), которое позволяет пользователям загружать несколько файлов (изображения на самом деле).Изменение размера изображения после загрузки и перед его сохранением в db

В настоящее время он хорошо работает, изображения хранятся в базе данных, и я могу их прочитать позже.

Но я хочу изменить размер изображений, прежде чем сохранять их в db, так как пользователь может загружать очень большие изображения.

Вот мой контроллер:

public ActionResult Create(Annonce annonce, IEnumerable<HttpPostedFileBase> photos) 
    { 
     if (ModelState.IsValid) 
     { 
      // Read each uploaded files and add if into the collection 
      foreach (HttpPostedFileBase fichier in photos) 
      {                     
       if (fichier != null && fichier.ContentLength > 0) 
       { 
        // Making a new object 
        var photo = new Photo 
        { 
         FileName = System.IO.Path.GetFileName(fichier.FileName), 
         ContentType = fichier.ContentType 
        }; 
        using (var reader = new System.IO.BinaryReader(fichier.InputStream)) 
        { 
         photo.Content = reader.ReadBytes(fichier.ContentLength); 
        } 
        // Add the current image to the collection 
        annonce.Photos.Add(photo); 
       } 
      } 

      db.Annonces.Add(annonce); 
      db.SaveChanges(); 
      return RedirectToAction("Details", new { id = annonce.ID }); 
     } 

     return View(annonce); 
    } 

Как я могу изменять размер изображений и все еще быть в состоянии сохранить их в БД? Возможно ли это?

Спасибо!

ответ

3

Этот код будет выполнять высокого качества изменения размеров. (Означает, что вы не будете терять очень много)

public static Bitmap ResizeImage(Image image, int width, int height) 
{ 
    var destRect = new Rectangle(0, 0, width, height); 
var destImage = new Bitmap(width, height); 

destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); 

using (var graphics = Graphics.FromImage(destImage)) 
{ 
    graphics.CompositingMode = CompositingMode.SourceCopy; 
    graphics.CompositingQuality = CompositingQuality.HighQuality; 
    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graphics.SmoothingMode = SmoothingMode.HighQuality; 
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    using (var wrapMode = new ImageAttributes()) 
    { 
     wrapMode.SetWrapMode(WrapMode.TileFlipXY); 
     graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode); 
    } 
} 

return destImage; 
} 

Вызов ResizeImage() и назначить его в растр, который вы будете вставлять в свой database.goodluck

вы можете преобразовать его в массив байтов и не хранить его в БД, как тип байт

public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
MemoryStream ms = new MemoryStream(); 
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); 
return ms.ToArray(); 
} 

вы можете сделать то же самое, но перевернутая, чтобы получить его и отобразить I т как изображение из БД:

public Image byteArrayToImage(byte[] byteArrayIn) 
    { 
    MemoryStream ms = new MemoryStream(byteArrayIn); 
    Image returnImage = Image.FromStream(ms); 
    return returnImage; 
    } 
+0

Спасибо, но как только у меня есть объект Bitmap, как я могу хранить его в БД? Я имею в виду, что эквивалентно этой строке: photo.Content = reader.ReadBytes (fichier.ContentLength); Но с растровым изображением? –

+0

@Papadoc отредактировал мой ответ. Надеюсь, вы поняли, как это сделать. отметив мой ответ, как ответ будет приятным :) – Slashy

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