如何平滑地自动移动图像?在 C# 中
本文关键字:图像 移动 何平滑 平滑 | 更新日期: 2023-09-27 18:34:18
我想实现图像在无限循环中流动的代码作为背景。为此。我准备了2个图像对象(图片框)。然后
我实现移动图像代码如下。(我清理了本主题中一些无关紧要的代码)
private void InitializeComponent()
{
this.p1.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
this.p1.Location = new System.Drawing.Point(0, -1000); // 0,0 // 0, -1000
this.p1.Size = new System.Drawing.Size(1000, 1000);
this.p2.Image = ((System.Drawing.Image)(resources.GetObject("picture")));
this.p2.Location = new System.Drawing.Point(0, 1000); // 0,0 // 0, -1000
this.p2.Size = new System.Drawing.Size(1000, 1000);
t1 = new Thread(new ParameterizedThreadStart(loop));
t1.Start();
}
private void loop(Object o)
{
CTMethod cttest = new CTMethod(movePictureBox);
while (true)
{
try
{
this.Invoke(cttest);
Thread.Sleep(10); // I updated..
} catch(Exception e) {
break;
}
}
}
private void movePictureBox()
{
if (p1.Top == 0)
{
p2.Top = p1.Top-p2.Height;
}
if (p2.Top == 0)
{
p1.Top = p2.Top-p1.Height;
}
p1.Top++;
}
此代码运行良好。但是我遇到了一些问题。2张图像的链接线(连接线)看起来卡顿或偶尔抖动。我不知道为什么图像会这样移动。这与 lerp(插值)有关系吗?如果有人知道原因,你能帮我吗?
这可能是
因为您正在使用System.Drawing.Point
http://msdn.microsoft.com/en-us/library/system.drawing.point%28v=vs.110%29.aspx
这意味着由System.Drawing.Point
确定的位置将捕捉到整数,从而导致动画期间一个像素的跳跃。
您可能希望使用System.Drawing.Pointf
(因为这使用浮点数而不是整数)
System.drawing.size
也是如此,它以整数描述宽度和高度
MSDN on system.drawing.size
不幸的是,所有Winforms控件(正如Rotem指出的那样)都使用System.Drawing.Point
,这使得它们本质上不适合平滑动画。
您最好将图片直接绘制到Graphics
对象上。
您可以尝试在表单构造函数中添加此代码,
SetStyle( ControlStyles.ResizeRedraw, true );
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );
SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
在WinForms中自定义绘图不是好的选择,XNA是不错的选择,它使用双缓冲区进行绘制。