要重现此问题,请在 Microsoft Paint 中创建一个 2x2 像素的黑色图像,另存为D:\small.png
. 然后在 Visual Studio 中创建一个带有无边距 PictureBox 的新 WinForms 应用。然后使用以下代码:
void f6(Graphics g)
{
var img = Image.FromFile(@"d:\small3.png");
var srcRect = new Rectangle(0, 0, img.Width, img.Height);
int factor = 400;
var destRect = new Rectangle(0, 0, img.Width * factor, img.Height * factor);
g.DrawRectangle(new Pen(Color.Blue), destRect);
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
}
void pictureBox1_Paint(object sender, PaintEventArgs e)
{
f6(e.Graphics);
}
我希望蓝色边距内的整个矩形都是黑色的,而输出如下:
为什么会这样?
好,谢谢。我不知道插值。现在,让我们将代码更改如下:
void f6(Graphics g)
{
var img = Image.FromFile(@"d:\small3.png");
var srcRect = new Rectangle(0, 0, img.Width, img.Height);
int factor = 200;
var destRect = new Rectangle(0, 0, img.Width * factor, img.Height * factor);
g.FillRectangle(new SolidBrush(Color.DarkCyan), pictureBox1.ClientRectangle);
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawRectangle(new Pen(Color.Blue), destRect);
g.DrawImage(img, destRect, srcRect, GraphicsUnit.Pixel);
}
它产生以下结果:
这仍然是不可接受的。我也试过 60x60 的图像。问题不是因为它是 2x2 图像。它们产生相同的效果。问题是为什么 GDI+ 决定不用整个 srcRect 填充整个 destRect?!最初的问题是我有一个大图像平铺在较小的图像中。我需要相邻的瓷砖既不重叠也不存在接缝。在 C++ 中,StretchBlt 可以正常工作。但它不会产生平滑的拉伸图像。