我正在为自己创建一个Sprite编辑器,因为我发现其他所有可用选项都不令人满意。我决定使用C#和WinForms,因为这似乎是制作实用程序的最简单选择。为了创建将在其上编辑精灵的画布,我创建了一个自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
是Rectangle
的事实似乎没有任何效果,使用常规offset.X
会产生相同的结果。我还尝试对offset.Y
和Substring
进行了铺底,但这并没有改善结果。
是什么原因导致以这种方式绘制图像?我有什么方法可以将子画面以正确的方式绘制到屏幕上?
答案 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);
}