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列变浅.
看到左上角放大了高质量的双三次和双三次.


..和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)
下面是典型HighQualityBicubic调整大小(在白色背景上绘制)的结果图像.

您可以在边线处看到半透明像素.你可以称之为bug.我认为这只是GDI +的技术细节.解决这个工件很简单.
...
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// add below line
g.CompositingMode = CompositingMode.SourceCopy;
...
Run Code Online (Sandbox Code Playgroud)
随着CompositingMode.SourceCopy结果图像将显示可见轮廓而不是抗锯齿与背景像素.
您可以完全忽略这些半透明像素.
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)