У меня есть операция на сайте, которая обрезает изображение, однако результирующее обрезанное изображение получается значительно больше с точки зрения размера файла (исходный размер 24 КБ, а обрезанное изображение - около 650 КБ). Итак, я обнаружил, что мне нужно применить некоторое сжатие к изображению перед его сохранением. Я придумал следующее:
public static System.Drawing.Image CropImage(System.Drawing.Image image, Rectangle cropRectangle, ImageFormat format)
{
var croppedImage = new Bitmap(cropRectangle.Width, cropRectangle.Height);
using (var g = Graphics.FromImage(croppedImage))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(
image,
new Rectangle(new Point(0,0), new Size(cropRectangle.Width, cropRectangle.Height)),
cropRectangle,
GraphicsUnit.Pixel);
return CompressImage(croppedImage, format);
}
}
public static System.Drawing.Image CompressImage(System.Drawing.Image image, ImageFormat imageFormat)
{
var bmp = new Bitmap(image);
var codecInfo = EncoderFactory.GetEncoderInfo(imageFormat);
var encoder = System.Drawing.Imaging.Encoder.Quality;
var parameters = new EncoderParameters(1);
var parameter = new EncoderParameter(encoder, 10L);
parameters.Param[0] = parameter;
using (var ms = new MemoryStream())
{
bmp.Save(ms, codecInfo, parameters);
var resultImage = System.Drawing.Image.FromStream(ms);
return resultImage;
}
}
Я установил низкое качество, чтобы увидеть, есть ли вообще какие-либо изменения. Нет. Кроп сохраняется корректно внешне, но сжатие не радует. Если я полностью обойду CompressImage(), ни размер файла, ни качество изображения не будут отличаться.
Итак, 2 вопроса. Почему ничего не происходит? Есть ли более простой способ сжать результирующее изображение для «оптимизации в Интернете», аналогично тому, как фотошоп сохраняет веб-изображения (я думал, что он просто удалил из него много информации, чтобы уменьшить размер).