C# WinForms:使用Graphics.DrawImage时,边缘像素会被切成两半

C# WinForms:使用Graphics.DrawImage时,边缘像素会被切成两半,c#,winforms,C#,Winforms,我正在为自己制作一个精灵编辑器,因为我发现所有其他可用选项都不令人满意。我决定使用C#和WinForms,因为这似乎是制作实用程序的最简单选择。为了创建用于编辑精灵的画布,我创建了一个从UserControl继承的自定义类 到那时为止,一切都很顺利,但后来我增加了放大和缩小的功能。它工作得相当好,除了我的图像的上边缘和左边缘在中间点被切断的事实 下面是绘制图像的OnPaint类方法 protected override void OnPaint(PaintEventArgs e) {

我正在为自己制作一个精灵编辑器,因为我发现所有其他可用选项都不令人满意。我决定使用C#和WinForms,因为这似乎是制作实用程序的最简单选择。为了创建用于编辑精灵的画布,我创建了一个从
UserControl
继承的自定义类

到那时为止,一切都很顺利,但后来我增加了放大和缩小的功能。它工作得相当好,除了我的图像的上边缘和左边缘在中间点被切断的事实

下面是绘制图像的
OnPaint
类方法

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    RectangleF drawArea = new RectangleF(offset.X, offset.Y, sprite.Width * zoom, sprite.Height * zoom);

    e.Graphics.InterpolationMode = (zoom >= 1)? InterpolationMode.NearestNeighbor : InterpolationMode.Default;
    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(31, 0, 0, 0)), drawArea);
    e.Graphics.DrawImage(sprite, drawArea);
}
sprite
是一个
Bitmap
实例,
offset
是一个
PointF
zoom
是一个
float

事实上,
drawArea
是一个
RectangleF
似乎没有效果,使用常规的
矩形
会产生相同的结果。我还尝试了地板
offset.X
offset.Y
,但没有改善结果


是什么导致图像以这种方式绘制,以及我有什么替代方法可以将精灵以正确的方式绘制到屏幕上?

TaW的建议是正确的,我需要确保
图形。PixelOffsetMode
设置为
一半

这是生成正确结果的代码:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    RectangleF drawArea = new RectangleF(offset.X, offset.Y, sprite.Width * zoom, sprite.Height * zoom);

    if (zoom >= 1)
    {
        e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
        e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
    }
    else
    {
        e.Graphics.InterpolationMode = InterpolationMode.Default;
        e.Graphics.PixelOffsetMode = PixelOffsetMode.Default;
    }

    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(31, 0, 0, 0)), drawArea);
    e.Graphics.DrawImage(sprite, drawArea);
}

您尝试过不同的插值模式吗?是的,我尝试过其他插值模式,它们似乎都有类似的问题,但由于模糊度较低。您可能需要更改插值模式。是的,我需要确保它设置为
一半。