Предотвращение увеличения размера изображения при уменьшении размеров

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

Функция успешно уменьшает размер изображения (с точки зрения размеров), но размер файла резко увеличивается.

Пример: изменен размер изображения, которое изначально составляло 32,2 КБ, и теперь его размер составлял 828x251. На выходе получается изображение размером 374 КБ и размером 577x200.

Ниже представлена ​​используемая функция:

public static string resizeImage(string imgToResize)
{
    try
    {
        string image_info = imgToResize.Split(',')[0];
        MemoryStream ms = new MemoryStream(Convert.FromBase64String(imgToResize.Split(',')[1]));
        System.Drawing.Image converted_image = System.Drawing.Image.FromStream(ms);
        int original_width = converted_image.Width;
        int original_height = converted_image.Height;

        // Figure out the ratio
        double ratioX = (double) original_width / (double) original_height;
        double ratioY = (double) original_height / (double) original_width;
        // use whichever multiplier is smaller
        double ratio = ratioX < ratioY ? ratioX : ratioY;

        int new_height = 0;// Convert.ToInt32(original_height * ratio);
        int new_width = 0;// Convert.ToInt32(original_width * ratio);
        // now we can get the new height and width
        if (original_width <= original_height)
        {
            new_width = 200;
            new_height = Convert.ToInt32((decimal)new_width / (decimal)ratio);
        }
        else {
            new_width = Convert.ToInt32((decimal)original_width * (1-(decimal)ratio));
            new_height = 200;
        }


        Size image_size = new Size(new_width, new_height);

        System.Drawing.Image new_image =  (System.Drawing.Image)(new Bitmap(converted_image, image_size));

        using (MemoryStream m = new MemoryStream())
        {
            new_image.Save(m, ImageFormat.Bmp);
            byte[] imageBytes = m.ToArray();
            string base64String = Convert.ToBase64String(imageBytes);
            return image_info + "," + base64String;
        }
    }
    catch (Exception ex) {
        ErrorSignal.FromCurrentContext().Raise(ex);
    }

    return "";
}

Может ли кто-нибудь объяснить, почему размер файла резко увеличивается из-за этого уменьшения размеров и как его предотвратить (или фактически уменьшить размер файла в дополнение к уменьшению его размеров)?


person Isaac Byrne    schedule 24.09.2019    source источник
comment
Каков исходный формат файла изменяемого изображения? Вы сохраняете изображение с измененным размером как растровое изображение, которое обычно намного больше, чем, скажем, jpeg. Если исходный файл - это jpeg, а файл с измененным размером - растровое изображение, я не удивлюсь, если последний имеет больший размер файла.   -  person inejwstine    schedule 24.09.2019
comment
Это .PNG, и я пытаюсь изменить его размер на другой .PNG   -  person Isaac Byrne    schedule 24.09.2019
comment
Нет, не знаешь. Вы сохраняете как несжатый BMP. Не путайте класс Bitmap и формат файла BMP !!   -  person TaW    schedule 24.09.2019
comment
ЛАДОНИ ДЛЯ ЛИЦА Ух!   -  person Isaac Byrne    schedule 24.09.2019
comment
Если у вас обрабатываются другие форматы, вы можете использовать converted_image.RawFormat; это должен быть формат файла, который вы открыли. Кстати, вам действительно следует поместить каждое созданное вами растровое изображение в блок using, чтобы впоследствии они были должным образом утилизированы.   -  person Nyerguds    schedule 21.10.2019


Ответы (1)


Вы сохраняете его как .bmp, который будет иметь гораздо больший размер файла.

Измените строку new_image.Save(m, ImageFormat.Bmp); на new_image.Save(m, ImageFormat.Png); или new_image.Save(m);, что сохранит ее как .png вместо несжатого .bmp (последний выбирает формат .png по умолчанию).

См. Image.Save документы для получения дополнительной информации.

person inejwstine    schedule 24.09.2019