2013-05-04 3 views
3

Я просто загружаю изображение в формате JPEG и сохраняю его без каких-либо манипуляций с ним. Но качество изображения заметно уменьшается.C#: снижение качества изображения при сохранении JPEG при 100% -ном качестве

Вот код:

Bitmap imgOutput = new Bitmap(@"D:\image.jpg"); 
Graphics outputGraphics = Graphics.FromImage(imgOutput);  

EncoderParameters myEncoderParameters = new EncoderParameters(3); 
myEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
myEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)EncoderValue.ScanMethodInterlaced); 
myEncoderParameters.Param[2] = new EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)EncoderValue.RenderProgressive); 

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo ici = null; 
foreach (ImageCodecInfo codec in codecs) 
{ 
    if (codec.MimeType == "image/jpeg") 
     ici = codec; 
} 

imgOutput.Save(@"D:\result.jpg", ici, myEncoderParameters); 

И что я получаю: http://i.imgur.com/5bG1tPM.jpg зум: http://i.imgur.com/vdx8sL5.jpg

Есть еще настройки качества изображения?

ответ

4

JPEG, являющийся форматом с потерями, представляет собой потерю при каждом сохранении. Это также особенно плохо при сжатии острых краев. Согласно this MSDN article, вы правильно устанавливаете качество изображения. Вы можете играть с другими настройками, если хотите попытаться оптимизировать качество изображения, так как я не знаю, как вы придумали ScanMethod и RenderMethod. Однако наилучшим способом, на мой взгляд, является использование формата без потерь (PNG, TIFF и т. Д.).

Update

Оказывается, что это происходит из-за плохой кодер GDI + JPEG. Подробнее об этом на the MSDN forums. Вывод: используйте стороннюю библиотеку изображений, там есть много свободных.

+0

Да, PNG экономит деньги. Но, несмотря на то, что JPEG имеет формат с потерями, когда я открываю изображение в Photoshop, а затем сохраняю его как JPEG, результат изображения безупречен (и даже с меньшим размером файла). Это означает, что формат JPEG позволяет сохранять изображения более корректно. И я хотел бы знать, как) – user1032559

+0

@ user1032559 Кажется, что GDI + это плохо. См. Обновление и ссылку. –

+0

Я просмотрел исходный код этого инструмента - http://www.codeproject.com/Articles/9727/Image-Processing-Lab-in-C Он сохраняет изображения стандартными методами и работает хорошо. Единственное отличие состоит в том, что они не используют EncoderParameters. Но когда я сохраняю изображение без этих параметров, общее качество JPEG очень низкое. – user1032559

Смежные вопросы