我正在解决一个问题,即当我使用 GDI 操作调整大小后的图像时,它们会失去色彩饱和度。
我正在加载一个 JPG 作为原始图片,调整它的大小,结果图像的饱和度(颜色强度)比原始图片低很多。我能做些什么来改善它?这是我的代码:
using ( var original = System.Drawing.Image.FromStream( new MemoryStream( image.RawData ) ) ) { using ( var dst = new Bitmap( width, height, PixelFormat.Format32bppArgb ) ) { using ( var g = Graphics.FromImage( dst ) ) { g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; g.DrawImage( original, 0, 0, dst.Width, dst.Height ); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage( original, 0, 0, dst.Width, dst.Height ); var jpgEncoder = GetEncoder( ImageFormat.Jpeg ); var myEncoderParameters = new EncoderParameters( 1 ); var quality = 95; var myEncoderParameter = new EncoderParameter( Encoder.Quality, quality ); myEncoderParameters.Param[0] = myEncoderParameter; dst.Save( buffer, jpgEncoder, myEncoderParameters ); } } }
我尝试过使用不同的像素格式、删除所有滤镜等,但我总是得到相同的结果。这是 GDI 的一些已知问题,还是我遗漏了什么?
插件: 在 Paint.NET 中打开图像时,即使没有重新缩放,我也会遇到同样的低饱和度问题,所以我猜这是 GDI+ 加载图像 (jpgs) 的方式?
这张图片是用颜色配置文件 sRGB 从 photoshop 保存的,但是 afaik JPG 没有嵌入颜色配置文件的信息。即使这样做了,我相信 firefox 也不会遵守它们(这是我测试过的)
更多测试表明它在 IE8 中看起来与 Firefox 不同。 JPG 似乎支持颜色配置文件,但大多数应用程序并不遵守它们。然而,FF3.5 似乎可以做到。图像上使用的是 Adobe RGB,而不是 sRGB。
最佳答案
我自己找到了答案。它与 GDI+ 中默认未应用的颜色配置文件有关。许多人声称您不能使用 GDI 自动应用颜色配置文件,但显然,我需要做的唯一更改是:
使用(var original = System.Drawing.Image.FromStream(new MemoryStream(image.RawData)))
到
使用 ( var original = new Bitmap( new MemoryStream( image.RawData ), true ) )
显然,Bitmap 是 Image 的派生类,Bitmap 的构造函数可以采用流和“useIcm”的 bool 值。这对我有用。
关于c# - 在 .NET 中使用 GDI 调整图像大小会导致低饱和度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577032/