在GDI调整大小时,c# – Ghost-borders(‘ringing’)

会发生什么(仅在某些图像上显而易见),我会看到一个1像素的白色边框插入一个像素。似乎发生在轻而不是白色的地区(例如天空)。它类似于当某物被过度锐化并且可以在高对比度边缘旁边看到一个幽灵边界时。

这是一个完美的再现代码。我使用所有最高质量的设置进行缩放。

ImageCodecInfo encoder = null;
EncoderParameters encoderParams = null;

foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())
{
    if (codec.MimeType == "image/jpeg")
    {
        encoder = codec;

        // use highest quality compression settings
        encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
        break;
    }
}

using (Bitmap input = (Bitmap)Bitmap.FromFile(inputPath, true))
{
    // shrink by multiple of 2
    Rectangle rect = new Rectangle(0, 0, input.Width/32, input.Height/32);

    using (Bitmap output = new Bitmap(rect.Width, rect.Height))
    {
        using (Graphics g = Graphics.FromImage(output))
        {
            // use highest quality settings (updated per Mark Ransom's answer)
            g.CompositingMode = CompositingMode.SourceCopy;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;

            g.DrawImage(input, rect);
        }

        output.Save(outputPath, encoder, encoderParams);
    }
}

有任何想法吗?我完全感到困惑我读了大量的问题/答案,都没有影响到我的情况。

编辑:

这是图像之前的一个例子:http://img14.imageshack.us/img14/4174/mg1647.jpg

这是一个例子:image:http://img64.imageshack.us/img64/3156/afterringing.jpg

它与原始文件(在主机服务“优化”之前)更为明显,但是您可以在天空中看到较小的图像上的一个较轻的一个像素点。

我终于找到了一篇关于这个的文章。

Libor Tinka随便提到这一点,然后再展示他的广泛的过滤器,其性能优于GDI缩放:

> http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx

从他的建议来看,它听起来像是正在做我们怀疑的事情:它正在从图像边缘的周边像素拉平均细节。这似乎是对我的算法的一个缺陷,但这是开放辩论。为了解决这个问题,有一个ImageAttributes类,您可以在其中指定超出的像素只是其中的像素的镜像。设置这似乎完全消除了响铃:

using (ImageAttributes wrapMode = new ImageAttributes())
{
    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
    g.DrawImage(input, rect, 0, 0, input.Width, input.Height, GraphicsUnit.Pixel, wrapMode);
}

非常感谢Libor Tinka的解决方案,还有Mark Ransom帮助我思考这个问题,并给我一个“敲响”这个词,这是Libor Tinka的解决方案甚至在我的搜索中出现的。

翻译自:https://stackoverflow.com/questions/1890605/ghost-borders-ringing-when-resizing-in-gdi

转载注明原文:在GDI调整大小时,c# – Ghost-borders(‘ringing’)