System.Drawing.Imaging
дает вам дополнительный контроль над сжатием изображения, если вы передаете кодек JPEG и задаете параметр кодера для Качества, который, по сути, является процентным удержанием.
Вот функция, которую я использую с параметром "image/jpeg"
, чтобы получить кодек JPEG. (Это не относится к сжатию само по себе , но для перегрузок Image.Save
, которые принимают EncoderParameters
, требуется ImageCodecInfo
вместо ImageFormat
.)
// assumes an encoder for "image/jpeg" will be available.
public static ImageCodecInfo GetCodec( string mimeType )
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for( int i = 0; i < encoders.Length; i++ )
if( encoders[i].MimeType == mimeType )
return encoders[i];
return null;
}
Затем вы можете установить параметры кодера перед сохранением изображения.
EncoderParameters ep = new EncoderParameters(2);
ep.Param[0] = new EncoderParameter( Encoder.Quality, percentRetention ); // 1-100
ep.Param[1] = new EncoderParameter( Encoder.ColorDepth, colorDepth ); // e.g. 24L
(Существуют другие параметры датчика - см. Документацию.
Итак, сложите все вместе, и вы можете сказать
image.Save( outFile, GetCodec("image/jpeg"), ep );
(Я храню кодек и параметры в статических значениях, так как они используются снова и снова, но я хотел упростить пример здесь.)
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ: Если вы масштабируете изображения, у вас также есть некоторый контроль над качеством. Да, это очень «черный ящик», но я считаю, что он работает хорошо. Вот «хорошие и медленные» настройки (которые нужно установить перед вызовом DrawImage, но вы можете посмотреть «быстрые и грязные» версии.
// good & slow
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;