C# WinForms:使用Graphics.DrawImage时,边缘像素会被切成两半
我正在为自己制作一个精灵编辑器,因为我发现所有其他可用选项都不令人满意。我决定使用C#和WinForms,因为这似乎是制作实用程序的最简单选择。为了创建用于编辑精灵的画布,我创建了一个从C# WinForms:使用Graphics.DrawImage时,边缘像素会被切成两半,c#,winforms,C#,Winforms,我正在为自己制作一个精灵编辑器,因为我发现所有其他可用选项都不令人满意。我决定使用C#和WinForms,因为这似乎是制作实用程序的最简单选择。为了创建用于编辑精灵的画布,我创建了一个从UserControl继承的自定义类 到那时为止,一切都很顺利,但后来我增加了放大和缩小的功能。它工作得相当好,除了我的图像的上边缘和左边缘在中间点被切断的事实 下面是绘制图像的OnPaint类方法 protected override void OnPaint(PaintEventArgs e) {
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);
}
您尝试过不同的插值模式吗?是的,我尝试过其他插值模式,它们似乎都有类似的问题,但由于模糊度较低。您可能需要更改插值模式。是的,我需要确保它设置为一半。