在.NET中使用GDI调整图像大小会降低饱和度
我正在处理一个问题,当我使用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有关的已知问题,还是我错过了什么?
Addon:在Paint.NET中打开图像时,即使没有重新缩放,我也会得到低饱和度的问题,所以我猜这是GDI +加载图像(jpgs)的方式?
此图像是从色彩配置文件sRGB的photoshop中保存的,但afaik JPG没有嵌入colorprofiles的信息。 即使它确实如此,我相信Firefox不会服从它们(这是我测试过的)
更多的测试显示,IE8的外观与firefox不同。 JPG似乎支持颜色配置文件,但大多数应用程序不遵守它们。 然而,FF3.5似乎这样做。 它是Adobe RGB,而不是图像上的sRGB。
我自己找到了答案。 它与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”的流和布尔值。 这对我来说是诀窍。
我使用了一个图像缩放代码,但我没有看到您提到的效果。
我看到的主要区别是我使用Format24bppRgb而不是Format24bpp A Rgb
请记住,JPG无论如何都没有Alpha通道(afaik)
从另一个角度来看,如果您想自己解决这个问题,我会强烈建议http://nathanaeljones.com/products/asp-net-image-resizer/。 它甚至会照顾磁盘缓存!
链接地址: http://www.djcxy.com/p/50289.html上一篇: Image resize with GDI in .NET gives low saturation
下一篇: A generic error occurred in GDI+, JPEG Image to MemoryStream