2016-01-26 4 views
3

Для загрузки изображения Я использую plupload на стороне клиента. Тогда в моей контролируемой У меня есть следующая логика:C# Загрузить изображение и сохранить в виде растрового изображения Увеличить размер изображения

public ActionResult UploadFile() 
{ 
    try 
    { 
     var file = Request.Files.Count > 0 ? Request.Files[0] : null; 
     using (var fileStream = new MemoryStream()) 
     { 
      using (var oldImage = new Bitmap(file.InputStream)) 
      { 
       var format = oldImage.RawFormat; 
       using (var newImage = ImageUtility.ResizeImage(oldImage, 800, 2000)) 
       { 
        newImage.Save(fileStream, format); 
       } 

       byte[] bits = fileStream.ToArray(); 
      } 
     } 
    { 
    catch (Exception ex) 
    { 
    } 
} 

ImageUtility.ResizeImage Метод:

public static class ImageUtility 
{ 
    public static Bitmap ResizeImage(Bitmap image, int width, int height) 
    { 
     if (image.Width <= width && image.Height <= height) 
     { 
      return image; 
     } 

     int newWidth; 
     int newHeight; 
     if (image.Width > image.Height) 
     { 
      newWidth = width; 
      newHeight = (int)(image.Height * ((float)width/image.Width)); 
     } 
     else 
     { 
      newHeight = height; 
      newWidth = (int)(image.Width * ((float)height/image.Height)); 
     } 

     var newImage = new Bitmap(newWidth, newHeight); 
     using (var graphics = Graphics.FromImage(newImage)) 
     { 
      graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
      graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      graphics.FillRectangle(Brushes.Transparent, 0, 0, newWidth, newHeight); 
      graphics.DrawImage(image, 0, 0, newWidth, newHeight); 
      return newImage; 
     } 
    } 
} 

Вопрос, который я есть здесь что размер изображения увеличивается. Я загрузил изображение 1,62 МБ и после того, как этот контроллер вызывается, и он создает экземпляр, если битмап, а затем сохраняет битмап для фильтрации и чтения бит с помощью «fileStream.ToArray();» Я получаю 2,35 МБ в «битах».

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

+0

Изменение формата файла изменяет размер данных, так как разные типы изображений хранят данные изображения по-разному. – David

ответ

0

Ответ прост, битмап занимает больше памяти в любом формате, в котором ранее находилось изображение, поскольку он несжатый, он остается в этом несжатом формате после его сохранения.

0

jpeg, png, gif и т. Д. Сжаты и, следовательно, используют меньше байтов, то есть растровое изображение, которое несжато.

Если вы хотите сохранить исходное изображение, просто сохраните файл. InputStream.

Если вам нужно изменить размер, вы можете использовать библиотеку, чтобы применить сжатие jpg/png/etc, а затем сохранить результат.

+0

Могу ли я затем сжать битмап снова? – carpics

+0

Вы должны иметь возможность называть 'newImage.Save (" file.png ", ImageFormat.Png);' или 'ImageFormat.Jpg' – wertzui

0

Какая у вас задание? Вы просто пытаетесь загрузить изображение? Нужно ли его проверять как изображение? Или вы просто пытаетесь загрузить файл?

Если загрузка является целью, без какого-либо учета валидации, просто переместите биты и сохраните их с именем файла. Как только вы это сделаете ...

using (var oldImage = new Bitmap(file.InputStream)) 

... вы конвертируете в растровое изображение. Здесь вы указываете битмап, какой формат использовать (raw).

var format = oldImage.RawFormat; 

Если вы просто хотите, чтобы переместить файл (загрузки), вы можете запустить поток памяти на объект FileStream и сохранять биты.

Если вы хотите, чтобы несколько проверок, является ли изображение пустым и т. Д., Вы можете попробовать эту страницу (http://www.codeproject.com/Articles/1956/NET-Image-Uploading), но поймите, что она по-прежнему помещает ее в изображение, которое не является вашим желанием, если вы просто хотите сохранить "как есть".

+0

Да, я просто пытаюсь загрузить изображение, его не нужно проверять как изображение. Но причина, по которой я сохраняю, - это битмап, поэтому я могу проверить Widht и высоту изображения и изменить его размер, если ширина> 800 или высота> 2000. Пожалуйста, снова проверьте мой вопрос, я его отредактировал – carpics

+0

Вы только изменяете размер, если это очень маленький? Или вы тоже изменяете размер. Кажется, вы всегда подбираете размер до 800 x 2000. Если изображение меньше, оно будет больше после изменения размера. Это часть алгоритма. Кстати, я бы осторожно использовал биты .NET для изменения размера, поскольку они оставляют артефакты. Если требуется изменить размер, то я бы рассмотрел лучшую библиотеку изображений, чтобы изображения были четкими.Поскольку у вас есть сырые продукты, у вас будет меньше проблем, но вы также будете иметь дело с большими изображениями. –

+0

Я изменяю размер, только если он слишком большой. Никогда, если он слишком мал. Таким образом, исходное изображение будет изменено, если ширина будет больше 800 или высота больше 2000 до меньшего размера. Othervise это не будет изменяться вообще. И когда он не изменен, я получаю больше бит, я понимаю, это потому, что битмап не скомпонован. Могу ли я после изменения размера снова сжать его? – carpics

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