DrawImage调整图像太小

当我使用Graphics.DrawImage绘制图像并以比原始图像更大的尺寸绘制图像时,它最终会有点太小。 您可以在下图中看到:
在此处输入图像描述

绿线不应该是可见的,也不是图像的一部分。 相反,它们被绘制在图像后面,图像应该覆盖它们。

如何绘制尺寸合适的图像?

编辑 :我绘制绿色部分与我传递到DrawImage调用相同的矩形,具有图像应该有多大的确切尺寸。 所以我的价值观没有任何缺陷(我认为)。

编辑2 :我使用FillRectangle绘制绿色矩形,因此不需要进行笔计算。 此外,我记录了传递给图像和绿色填充的矩形的值,并且值是正确的。 这只是图像的关闭。 我稍后会发布代码,因为我现在不在我的电脑上。

编辑3 :这是我用来渲染图像的代码:

 // This is for zooming public readonly float[] SCALES = { 0.05f, 0.1f, 0.125f, 0.25f, 0.333f, 0.5f, 0.667f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f, 10.0f, 12.0f, 15.0f, 20.0f, 30.0f, 36.0f }; private int scaleIndex = 8; protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); float ScaleFactor = SCALES[scaleIndex]; e.Graphics.InterpolationMode = ScaleFactor < 1 ? InterpolationMode.Bicubic : InterpolationMode.NearestNeighbor; Image im = Properties.Resources.TSprite0; for (int y = 0; y < TilesVertical; y++) { for (int x = 0; x < TilesHorizontal; x++) { float sx = im.Width * ScaleFactor; float sy = im.Height * ScaleFactor; Point p = new Point((int)(-scrollPosition.X + sx * x), (int)(-scrollPosition.Y + sy * y)); Size s = new Size((int)Math.Floor(sx), (int)Math.Floor(sy)); // The green rectangle in the background should be the same size as the image e.Graphics.FillRectangle(Brushes.Lime, new Rectangle(p, s)); e.Graphics.DrawImage(im, new Rectangle(p, s), 0, 0, 16, 16, GraphicsUnit.Pixel); } } im.Dispose(); } 

编辑4 :另请注意,图像似乎在左侧和顶部裁剪而不是resize。 看一下在Photoshop中放大的原始图像的比较,然后看看GDI +如何渲染它: 在此处输入图像描述

缩放到2倍或更大时会出现问题。

看起来整个问题是由错误的默认PixelOffsetMode引起的。

通过在渲染过程中偏移像素,可以提高渲染质量,但代价是渲染速度。

将其设置为

 g.PixelOffsetMode = PixelOffsetMode.Half; 

让它离我而去。

将其设置为

 g.PixelOffsetMode = PixelOffsetMode.HighQuality; 

也行得很好。

DefaultNoneHighSpeed导致图像向左和向上渲染一点。

通常你也想设置InterpolationMode.NearestNeighbor