c#:以 100% 质量保存 JPEG 时降低图像质量

Posted

技术标签:

【中文标题】c#:以 100% 质量保存 JPEG 时降低图像质量【英文标题】:c#: reduced image quality when saving JPEG at 100% quality 【发布时间】:2013-05-04 11:10:01 【问题描述】:

我只是加载 JPEG 图像并保存它,而无需对其进行任何操作。但图像质量明显下降。

代码如下:

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 zoom:http://i.imgur.com/vdx8sL5.jpg

还有其他画质设置吗?

【问题讨论】:

【参考方案1】:

JPEG 是一种有损格式,每次保存都会造成损失。它在压缩尖锐边缘方面也特别糟糕。根据this MSDN article,您正确设置了图像质量。如果您想尝试优化图像质量,您可以使用其他设置,因为我不知道您是如何提出 ScanMethod 和 RenderMethod 的。但是,我认为最好的方法是使用无损格式(PNG、TIFF 等)。

更新

这似乎是由于 GDI+ JPEG 编码器损坏造成的。更多关于它在the MSDN forums。结论是 - 使用第三方图像库,那里有很多免费的。

【讨论】:

是的,PNG 保存效果很好。但尽管 JPEG 是有损格式,但当我在 Photoshop 中打开图像然后将其另存为 JPEG 时,结果图像是完美无缺的(即使文件大小更小)。这意味着JPEG格式允许更正确地保存图像。我想知道如何) @user1032559 这似乎是 GDI+ 不好。查看更新和链接。 我查看了这个工具的源代码 - codeproject.com/Articles/9727/Image-Processing-Lab-in-C 它使用标准方法保存图像并且效果很好。一个区别是它们不使用 EncoderParameters。但是当我在没有这些参数的情况下保存图像时,JPEG的整体质量非常低。 如果您想要获得最好的质量 - 寻找 ImageMagick 或其他免费的图像处理库。 CodePlex 上的某个地方也有一个 C# 中的 JPEG 编码器。我分享您的经验,当您省略 EncoderParameters 时,质量还可以,但我不确定为什么以及是否总是这样。

以上是关于c#:以 100% 质量保存 JPEG 时降低图像质量的主要内容,如果未能解决你的问题,请参考以下文章

使用 Image 类在 c# 中丢失图像质量(减少颜色数量)

rad studio 11参数设置

pdf转成jpg后,图片变模糊了?

C# Base64 字符串到 JPEG 图像

是否可以判断 JPEG 的质量级别?

iText:降低图像质量(用于减小生成的 PDF 大小)