如何平滑地自动移动图像?在 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(插值)有关系吗?如果有人知道原因,你能帮我吗?

如何平滑地自动移动图像?在 C# 中

这可能是

因为您正在使用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是不错的选择,它使用双缓冲区进行绘制。