在 .NET 中使用 GDI 调整图像大小会降低饱和度

Posted

技术标签:

【中文标题】在 .NET 中使用 GDI 调整图像大小会降低饱和度【英文标题】:Image resize with GDI in .NET gives low saturation 【发布时间】:2010-12-07 07:34:31 【问题描述】:

我正在解决一个问题,即当我使用 GDI 操作调整大小的图像时,它们会失去色彩饱和度。

我将 JPG 加载为原始图片,调整其大小,结果图像的饱和度(颜色强度)比原始图片低很多。我能做些什么来改善它?这是我的代码:

使用(var original = System.Drawing.Image.FromStream(new MemoryStream(image.RawData))) 使用(var dst = new Bitmap(宽度,高度,PixelFormat.Format32bppArgb)) 使用 ( var g = Graphics.FromImage( dst ) ) g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.DrawImage(原始, 0, 0, dst.Width, dst.Height ); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(原始, 0, 0, dst.Width, dst.Height ); var jpgEncoder = GetEncoder(ImageFormat.Jpeg); var myEncoderParameters = new EncoderParameters( 1 ); 变量质量 = 95; var myEncoderParameter = new EncoderParameter(Encoder.Quality, quality); myEncoderParameters.Param[0] = myEncoderParameter; dst.Save(缓冲区,jpgEncoder,myEncoderParameters);

我尝试过使用不同的像素格式,删除所有过滤器等,但我总是得到相同的结果。这是 GDI 的一些已知问题,还是我遗漏了什么?

插件: 在 Paint.NET 中打开图像时,即使没有重新缩放,我也会遇到低饱和度的相同问题,所以我猜这是 GDI+ 加载图像 (jpgs) 的方式?

此图像是使用颜色配置文件 sRGB 从 Photoshop 保存的,但 afaik JPG 没有关于嵌入颜色配置文件的信息。即使这样做了,我相信 firefox 不会服从他们(这是我测试过的)

更多的测试表明它在 IE8 中看起来与 Firefox 不同。 JPG 似乎支持颜色配置文件,但大多数应用程序不遵守它们。然而,FF3.5 似乎做到了。而且图片上是 Adob​​e RGB,而不是 sRGB。

【问题讨论】:

image.RawData 哪里来的? @Andre:这只是包含图像的初始字节数组。就我而言,它是从数据库加载的,但它可以从任何地方加载。 Image.FromStream 接受一个流,因此它可以是 FileStream、网络流或其他任何东西。我有一个字节数组,所以我将它包装在 MemoryStream 中。 【参考方案1】:

我自己找到了答案。它与 GDI+ 中默认未应用的颜色配置文件有关。许多人声称您不能使用 GDI 自动应用颜色配置文件,但显然,我需要做的唯一更改是:

using ( var original = System.Drawing.Image.FromStream( new MemoryStream( image.RawData ) ) )

using ( var original = new Bitmap( new MemoryStream( image.RawData ), true ) )

显然,Bitmap 是 Image 的派生类,Bitmap 的构造函数既可以接受流,也可以接受“useIcm”的布尔值。这对我有用。

【讨论】:

非常感谢您的解释!我深入阅读了色度二次采样和其他可能导致颜色丢失的问题。将 uselcm 标志设置为 true 后,我的 jpeg 照片颜色完美。 我也有同样的问题,但上面没有区别.. :( 也许您的图像没有嵌入任何色彩校正信息?您是否尝试过使用不同的图像?【参考方案2】:

我有一个我使用的图像缩放代码,我没有看到你提到的效果。

我看到的主要区别是我使用的是 Format24bppRgb 而不是 Format24bppARgb

请记住,JPG 无论如何都没有 Alpha 通道 (afaik)

【讨论】:

【参考方案3】:

从另一个角度来看,我强烈推荐ImageResizer,如果你想自己摆脱痛苦的话。它甚至负责磁盘缓存。

【讨论】:

【参考方案4】:

去过那里,做到了。听起来很傻,但这很重要:

var quality = 95;
var myEncoderParameter = new EncoderParameter( Encoder.Quality, (long)quality );

long quality = 95;
var myEncoderParameter = new EncoderParameter( Encoder.Quality, quality );

var quality = 95L;
var myEncoderParameter = new EncoderParameter( Encoder.Quality, quality );

随便挑一个。

【讨论】:

压缩质量没有问题,只是色彩饱和度有问题。尝试了您的建议,但不幸的是它没有任何区别......

以上是关于在 .NET 中使用 GDI 调整图像大小会降低饱和度的主要内容,如果未能解决你的问题,请参考以下文章

调整图像大小 - WIC 与 GDI

GDI+TGPImage - 调整图像大小实例

Asp.net 图像大小调整质量

调整 Bootstrap 图像大小

.net 位图改变图像的颜色

在 vb.net 中操作/调整大小/缩放图像