在.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