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

时间:2011-01-23 04:17:13

标签: 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");

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

见左上角放大了高质量的双三次和双三次。

HighQualityBicubic

Bicubic

..和HighQualityBilinear

HighQualityBilinear

此论坛帖子似乎是有同样问题的人:DrawImage with sharp edges

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

更新:此处的评论中发生了非常类似的对话:GDI+ InterpolationMode

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:5)

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

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

1)防止抗锯齿。

...
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// add below line
g.CompositingMode = CompositingMode.SourceCopy;
...

使用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");

答案 2 :(得分:3)

将PixelOffset Mode属性设置为High Quality,以便更好地融合边缘的背景。