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

jis*_*shi 11 .net c# gdi+ colors image-processing

我正在解决一个问题,当我使用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 );
        }
    }
}

我已尝试使用不同的pixelformats,删除所有过滤器等,但我总是得到相同的结果.这是GDI的一些已知问题,还是我错过了什么?

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

此图像是从具有颜色配置文件sRGB的photoshop保存的,但是JPA没有关于嵌入的颜色配置文件的信息.即使它确实如此,我相信firefox也不遵守它们(这是我测试过的)

更多测试表明,与Firefox相比,它在IE8中看起来有所不同.JPG似乎支持颜色配置文件,但大多数应用程序不遵守它们.但是,FF3.5似乎也是这样做的.它是Adobe RGB,而不是图像上的sRGB.

jis*_*shi 21

我自己找到了答案.它与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"的布尔值.这对我有用.