Я создал функцию изменения размера изображения, которая является частью класса Utilities
в моем приложении. Функция делает то, что предназначено и изменяет размер файла. Однако размер нового файла больше. Пример: я загрузил изображение 1920x1080 размером 144 КБ. Новое изображение было 1500x816, что идеально, но это было 422 КБ, что побеждает цель изменения размера. Текущая функция выглядит следующим образом:
public static void SaveAndResizeImg(string imageFile, string outputFile, int maxWidth = 1500, int maxHeight = 1500)
{
using (var srcImage = Image.FromFile(imageFile))
{
System.Drawing.Imaging.ImageFormat format;
if (outputFile.IndexOf(".png", StringComparison.CurrentCultureIgnoreCase) != -1)
{
format = System.Drawing.Imaging.ImageFormat.Png;
}
else if (outputFile.IndexOf(".jpeg", StringComparison.CurrentCultureIgnoreCase) != -1)
{
format = System.Drawing.Imaging.ImageFormat.Jpeg;
}
else if (outputFile.IndexOf(".jpg", StringComparison.CurrentCultureIgnoreCase) != -1)
{
format = System.Drawing.Imaging.ImageFormat.Jpeg;
}
else if (outputFile.IndexOf(".gif", StringComparison.CurrentCultureIgnoreCase) != -1)
{
format = System.Drawing.Imaging.ImageFormat.Gif;
}
else if (outputFile.IndexOf(".tif", StringComparison.CurrentCultureIgnoreCase) != -1)
{
format = System.Drawing.Imaging.ImageFormat.Tiff;
}
else
{
format = System.Drawing.Imaging.ImageFormat.Bmp;
}
int newWidth, newHeight;
if (srcImage.Width > maxWidth && srcImage.Width > srcImage.Height)
{
newWidth = maxWidth;
newHeight = (int)Math.Ceiling(srcImage.Height * ((decimal)maxWidth / srcImage.Width));
}
else if (srcImage.Height > maxHeight && srcImage.Height > srcImage.Width)
{
newHeight = maxHeight;
newWidth = (int)Math.Ceiling(srcImage.Width * ((decimal)maxHeight / srcImage.Height));
}
else
{
newHeight = srcImage.Height;
newWidth = srcImage.Width;
}
using (var newImage = new Bitmap(newWidth, newHeight))
{
using (var graphics = Graphics.FromImage(newImage))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
newImage.Save(outputFile, format);
}
}
}
}
Я думал передать кодировку и параметр кодирования в функцию сохранения. Код сжатия, кажется, принимает параметр enum, но единственное перечисление, которое я видел, казалось, было связано с сжатием tiff. Я хочу иметь возможность сжимать изображения любого типа.