WinForms:使用Graphics.DrawImage时,边缘像素减少了一半

时间:2018-10-10 19:03:00

标签: c# winforms

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

到目前为止,一切都很好,但是后来我添加了放大和缩小的功能。除了我的图片的顶部和左侧边缘在中点处被切除之外,它的效果还算不错。

Notice how the edge pixels appear "cut in half"

这里是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

Bitmapoffset实例,PointFzoom,而floatdrawArea

RectangleFRectangle的事实似乎没有任何效果,使用常规offset.X会产生相同的结果。我还尝试对offset.YSubstring进行了铺底,但这并没有改善结果。

是什么原因导致以这种方式绘制图像?我有什么方法可以将子画面以正确的方式绘制到屏幕上?

1 个答案:

答案 0 :(得分:1)

TaW的建议是正确的,我需要确保将Graphics.PixelOffsetMode设置为Half

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

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);
}