InterpolationMode HighQualityBicubic在调整大小的图像边缘引入人工制品

rus*_*sau 10 c# graphics system.drawing

使用一些漂亮的标准C#代码来调整图像大小,并将其放在彩色背景上

Image imgToResize = Image.FromFile(@"Dejeuner.jpg");
Size size = new Size(768, 1024);
Bitmap b = new Bitmap(size.Width, size.Height);

Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.Green, 0, 0, size.Width, size.Height);

g.DrawImage(imgToResize, new Rectangle(0,150,768, 570));
b.Save("sized_HighQualityBicubic.jpg");
Run Code Online (Sandbox Code Playgroud)

结果在第0和第1列像素中有一个有趣的人工制品.第0列似乎与背景颜色混合,第1列变浅.

看到左上角放大了高质量的双三次和双三次.

HighQualityBicubic

双立方

..和HighQualityBilinear

HighQualityBilinear

这个论坛帖子似乎是有同样问题的人:具有锋利边缘的DrawImage

听起来像是我的错误?我可以理解为什么颜色会在调整大小的图像的顶部混合.但混合左/右边缘的颜色没有意义.有谁知道防止这些文物的修复?

更新:这里的评论非常相似:GDI + InterpolationMode

tee*_*yay 14

无耻地从这个问题中解决了答案,我发现这个解决了这个问题:

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


9da*_*dan 5

下面是典型HighQualityBicubic调整大小(在白色背景上绘制)的结果图像.

您可以在边线处看到半透明像素.你可以称之为bug.我认为这只是GDI +的技术细节.解决这个工件很简单.

1)防止抗锯齿.

...
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// add below line
g.CompositingMode = CompositingMode.SourceCopy;
...
Run Code Online (Sandbox Code Playgroud)

随着CompositingMode.SourceCopy结果图像将显示可见轮廓而不是抗锯齿与背景像素.

2)作物半透明区域

您可以完全忽略这些半透明像素.

Image imgToResize = Image.FromFile(@"Dejeuner.jpg");
Size size = new Size(768, 1024);
Bitmap b = new Bitmap(size.Width, size.Height);

Graphics g = Graphics.FromImage((Image)b);
g.FillRectangle(Brushes.Green, 0, 0, size.Width, size.Height);

Bitmap b2 = new Bitmap(768 + 8, 570 + 8);
{
    Graphics g2 = Graphics.FromImage((Image)b2);
    g2.Clear(Color.White);
    g2.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g2.DrawImage(imgToResize, new Rectangle(2, 2, 768 + 4, 570 + 4));
}

g.CompositingMode = CompositingMode.SourceCopy;
g.DrawImage(b2, 0, 150, new Rectangle(4, 4, 768, 570), GraphicsUnit.Pixel);
b.Save("sized_HighQualityBicubic.jpg");
Run Code Online (Sandbox Code Playgroud)

  • fyi,这是删除透明像素的好方法:http://stackoverflow.com/questions/1890605/ghost-borders-ringing-when-resizing-in-gdi (2认同)