Предотвращение увеличения размера изображения при уменьшении размеров - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть функция, которая принимает байтовый массив данных изображения, а затем изменяет его размер таким образом, чтобы его высота или ширина не превышали 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 "";
}

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

1 Ответ

1 голос
/ 24 сентября 2019

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

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

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

...