c# - 在 .NET 中使用 GDI 调整图像大小会导致低饱和度

标签 c# .net image-processing gdi+ colors

我正在解决一个问题,即当我使用 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 似乎可以做到。图像上使用的是 Adob​​e 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/

相关文章:

c# - 在 Android 或 iOS 平台中,应该使用哪个 Rx 调度程序来观察主线程?

c# - String.Concat(Object) 而不是 String.Concat(String) 的用途

c# - 为什么我的 COM 对象不显示组件服务中的方法?

php - 将透明图像复制到另一个透明图像上

c# - 为多个ASP.NET用户缓存WCF ChannelFactories

C# windows mobile 6 应用到 windows phone 7

opencv - 如何通过变换矩阵在python中执行图像变换操作(旋转、缩放、平移)

android - 图像处理 : Soft-Light algorithm like Photoshop

.net - NetSparkle 与 SparkleDotNET

.net - 如何确定 DockPanel 中包含的所有项目的高度