net: [[C#]]

1、GIF动画示例,利用几张彼此差异较小的图片制作GIF动画

步骤:

  1. 首先,需要将GIF动画分解为逐帧图像。可以使用许多工具来完成此操作,例如Adobe Photoshop,GIMP或在线GIF分解器。将所有帧保存为单独的图像文件(比如PNG或JPG格式),并记下每个图像的运行时间。

  2. 在Visual Studio中创建一个新的Windows窗体应用程序项目,并在设计器上创建一个PictureBox控件。将该控件的SizeMode属性设置为“Zoom”,以确保图像可以自动缩放以适合控件大小。

  3. 为了使图像序列成为动画,需要使用一个计时器。在图像序列上迭代,并在PictureBox控件上显示当前帧。此外,需要在控件的Paint事件中将背景颜色设置为透明以保留所有图像帧。以下是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private Image[] frames;  // 存放所有的帧图像
private int currentFrame = 0; // 当前帧的索引
private Timer timer; // 计时器

// 加载所有帧图像并配置计时器
private void LoadFrames()
{
frames = new Image[8]; // 假设有8张帧图像

for (int i = 0; i < 8; i++)
{
frames[i] = Image.FromFile($"{i + 1}.bmp"); // 假设图像文件名是frame_1.png, frame_2.png等等
}

timer = new Timer();
timer.Interval = 100; // 假设每帧持续时间是100毫秒
timer.Tick += Timer_Tick;
}

// 在PictureBox控件上 paint 事件中绘画当前帧
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(Color.Transparent);
e.Graphics.DrawImage(frames[currentFrame], new Point(0, 0));
}

// 计时器的 Tick 事件处理函数
private void Timer_Tick(object sender, EventArgs e)
{
currentFrame = (currentFrame + 1) % frames.Length;
pictureBox1.Invalidate(); // 强制重绘 PictureBox 控件
}

// 启动计时器
private void StartAnimation()
{
timer.Start();
}

// 停止计时器
private void StopAnimation()
{
timer.Stop();
}

将上述代码放置在窗体代码中,然后在Load事件中调用LoadFrames()函数以准备所有动画帧。调用StartAnimation()函数以启动动画,调用StopAnimation()函数以停止它。

希望这些步骤和代码片段能够帮助您实现在Windows窗体应用程序上显示利用几张彼此差异较小的图片制作的GIF动画。

注意事项:

  1. 在picturebox1的属性-事件窗口中,选中paint事件并将其与pictureBox1_Paint函数绑定。
  2. 图片与picturebox大小不一致可能导致黑边的出现,添加一行以下代码即可
    1
    pictureBox1.Size = new Size(frame1.Width, frame1.Height); // 将控件大小设置为第一帧图像大小
  3. 推荐在”项目名称\项目名称\bin\Debug”下建立文件夹放图片素材,因为该路径对应于{Application.StartupPath},即启动路径,下面是一个示例。
    1
    frames[i] = Image.FromFile($"{Application.StartupPath}/Resources/Images/frame_{i + 1}.png");


2、在窗体中显示一张图片,利用键盘控制图片上、下、左、右移动。利用双缓冲消除移动过程中出现的闪烁现象。

步骤:

  1. 在窗体设计器中,添加一个 PictureBox 控件,用于显示图片。将 PictureBoxSizeMode 属性设置为 StretchImage,以确保图像可以自适应大小并填充整个控件区域。
  2. 将要移动的图片加载到 PictureBox 中。可以从本地文件系统或其他资源库加载图片,例如:

  1. 实现键盘控制图片的移动。可以使用窗体的 KeyDown 事件来处理按键操作。例如,按下向右箭头键时,将图片的 Left 属性增加一个像素值,以向右移动图片。您可以创建一个 MovePicture() 方法来实现此逻辑。注意,为了避免闪烁现象,需要在每次移动之前,使用以下语句开启双缓冲:

    1
    DoubleBuffered = true;

    然后在 MovePicture() 方法中处理按键事件,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private void MovePicture(Keys direction)
    {
    const int step = 5; // 控制每次移动的步长

    switch (direction)
    {
    case Keys.Up:
    pictureBox1.Top -= step;
    break;
    case Keys.Down:
    pictureBox1.Top += step;
    break;
    case Keys.Left:
    pictureBox1.Left -= step;
    break;
    case Keys.Right:
    pictureBox1.Left += step;
    break;
    }
    }
  2. 订阅窗体的 KeyDown 事件,并在事件处理程序中调用 MovePicture() 方法,以响应用户键盘输入。例如:

    1
    2
    3
    4
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
    MovePicture(e.KeyCode);
    }
  3. 最后,记得启用窗体的 KeyPreview 属性,以确保窗体可以接收键盘输入:

    1
    KeyPreview = true;

完成以上步骤后,就可以在 Windows 窗体中向上、下、左、右移动一张图片了。使用双缓冲,可以有效消除移动过程中出现的闪烁现象。


References