编程语言
首页 > 编程语言> > c# – 如何禁用.NET / GDI的子采样?

c# – 如何禁用.NET / GDI的子采样?

作者:互联网

我试图使用Bitmap类保存JPEG图像.我注意到,无论我指定的质量水平如何,锋利的边缘总是blury.我发现这是由于一个或多个通道的二次采样.保存图像时如何禁用子采样?

我目前正在使用此代码:

EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 85L);

ImageCodecInfo codec = GetEncoderInfo("image/jpeg");
image.Save(path, codec, parameters);

注意

我知道JPEG是有损的,但这不是问题.如果我使用ImageMagick并使用默认选项保存图像,我会得到类似的结果.但是,如果我指定1:1:1子采样,则模糊消失.

我不想使用PNG,因为我需要更好的压缩.如果我将图像保存为BMP,然后手动将其转换为JPEG,我会得到很好的结果,而不会模糊.因此,格式不是这里的问题.

解决方法:

JPEG是一种使用lossy compression的图像格式.无论您选择何种质量设置,都会导致图像降级.

尝试使用更好的格式,例如.PNG.由于.PNG文件使用无损压缩算法,因此您将无法获得所看到的工件.

问题(在阅读您的编辑之后)可能是由于GDI在其默认编码器中对JPG文件使用4:1:1子采样.

我相信你可以安装另一个编码器(不知道如何做到这一点).否则,我建议使用像MagickNet这样的东西来处理保存你的JPG文件. (它是ImageMagick的.net包装器 – 其中有几个.)

编辑2:在进一步研究之后,通过调整编码器Luminance TableChrominance Table看起来你可能会对此产生一些影响.

标签:c,jpeg,gdi,system-drawing
来源: https://codeday.me/bug/20190607/1192977.html