2016-08-10 4 views
0

У меня есть приложение MVC, где вы можете загрузить изображение, и оно будет изменено до макс. 50KB. Я делаю изменение размера в цикле while, но проблема в том, что я уменьшаю ширину и высоту изображения, размер файла увеличивается. В определенный момент размер становится меньше, но за счет качестваC# - Уменьшить разрешение изображения увеличить размер файла

Request.InputStream.Position = 0; 
    string Data = new System.IO.StreamReader(Request.InputStream).ReadToEnd(); 
    var Base64 = Data.Split(',')[1]; 
    var BitmapBytes = Convert.FromBase64String(Base64); 
    var Bmp = new Bitmap(new MemoryStream(BitmapBytes)); 

    while (BitmapBytes.Length > 51200) 
    { 
     int Schritte = 20; //I tested here also with 300 
     int maxWidth = Bmp.Width; 
     maxWidth = maxWidth - Schritte; 
     int maxHeight = Bmp.Height; 
     maxHeight = maxHeight - Schritte; 
     Bmp = ScaleImage(Bmp, maxWidth, maxHeight); 
     var base64 = ReturnImageAsBase64(Bmp); 
     BitmapBytes = Convert.FromBase64String(base64); 
    } 

Кодекс, чтобы изменить размер:

public static Bitmap ScaleImage(Image image, int maxWidth, int maxHeight) 
{ 
    var ratioX = (double)maxWidth/image.Width; 
    var ratioY = (double)maxHeight/image.Height; 
    var ratio = Math.Min(ratioX, ratioY); 

    var newWidth = (int)(image.Width * ratio); 
    var newHeight = (int)(image.Height * ratio); 

    Bitmap newImage = new Bitmap(newWidth, newHeight); 
    using (Graphics gr = Graphics.FromImage(newImage)) 
    { 
     gr.SmoothingMode = SmoothingMode.HighQuality; 
     gr.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     gr.PixelOffsetMode = PixelOffsetMode.HighQuality; 
     gr.DrawImage(image, new Rectangle(0, 0, newWidth, newHeight)); 
    } 
    return newImage; 
} 

Я начинаю с Размер 66964 байт. После первого поворота в петле его 85151 байт и это, хотя ширина была уменьшена на 300 пикселей и высотой 420 пикселов.

+1

Я бы сказал, что это проблема вашего PixelFormat. Если у вас есть, например, растровое изображение с 1bpp (черным или белым) и нарисуйте его на свой newImage в ScaleImage, newImage создается с помощью Pixelformat по умолчанию, который, скорее всего, будет с цветами, поэтому вы получите 24bpp, что приведет к значительному увеличению размера памяти , –

ответ

0

От мой комментарий раньше:

Я бы сказал, что это проблема вашего PixelFormat. Если у вас есть, например, растровое изображение с 1bpp (черным или белым) и нарисуйте его на свой newImage в ScaleImage, newImage создается с помощью Pixelformat по умолчанию, который, скорее всего, будет с цветами, поэтому вы получите 24bpp, что приведет к значительному увеличению размера памяти ,

Try изменения:

Bitmap newImage = new Bitmap(newWidth, newHeight); 

в

Bitmap newImage = new Bitmap(newWidth, newHeight, image.PixelFormat); 

Edit: Как использование индексированных PixelFormats, кажется, невозможно создать графический объект из, кажется, нет легкого решения по этому вопросу ,

Чтобы объяснить причину большего размера изображения:

Исходное изображение: Цвет таблицы поиска:

1 = Red = 255, 0,0 
2 = Black = 0, 0,0 
3 = Green = 0,255,0 
... 

     Column  
    Row 1 2 3 4 
     1 1 1 1 1 
     2 1 1 1 1 
     3 2 2 2 2 
     4 3 3 3 3 

Здесь у вас есть 16 байт на 16 пикселей и 12 байт для таблицы поиска (один байт для номера индекса и три байта для каналов RGB для каждого цвета) Таким образом, общий размер изображения составляет 28 байтов

В newImage нет таблицы поиска, поэтому каждый пиксель имеет полный RGB информация:

  Column  
    Row 1   2   3   4 
     1 (255, 0,0) (255, 0,0) (255, 0,0) (255, 0,0) 
     2 (255, 0,0) (255, 0,0) (255, 0,0) (255, 0,0) 
     3 ( 0, 0,0) ( 0, 0,0) ( 0, 0,0) ( 0, 0,0) 
     4 ( 0,255,0) ( 0,255,0) ( 0,255,0) ( 0,255,0) 

Так размер newImage составляет 3 * 16 = 48 байт

+0

Это генерирует исключение только в следующей строке, где я создаю новую графику. (Графический объект не может быть создан из изображения с индексированным пиксельным форматом.) – Lexu

+0

Это, по-видимому, ограничение класса Graphics. См. Здесь: http://stackoverflow.com/questions/17313285/graphics-on-indexed-image –

+0

Но это прекрасно объясняет, что происходит: у вашего исходного изображения есть таблица поиска цветов, а пиксели указывают только на поиск для цвета , На новом изображении цвет сохраняется один раз на пиксель, поэтому вы выбираете больший размер для изображения. –

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