使用 gdi+ 进行无闪烁绘图

Flickerfree drawing using gdi+

我有一个要绘制的 .png 文件,但问题是,我每 1/10 秒绘制一次此 png,所以每秒绘制 10 次。此 png 是以 X 和 Y 坐标作为中点绘制的,因此图像的中间是 X 和 Y 坐标。

使用此代码:

private void frmMap_Paint(object sender, PaintEventArgs e)
{
   Bitmap FlashLight = new Bitmap(
      Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"light.png"), 4000, 2160);
   e.Graphics.DrawImage(FlashLight, new Point(mapX, mapY));
}

问题是,当每秒绘制此 png 10 次时,改变 X 和 Y 坐标会导致大量闪烁。

有没有人知道如何减少或消除闪烁?我研究过在屏幕外绘制位图并在绘制完成后加载它,但我不知道该怎么做。

我也研究过双缓冲,我也不知道如何使用它来减少闪烁。

Winforms绝对不适合做动画

这是一个建议,您可能会觉得不够好:

将大 Image 加载到 PictureBox.Image 并设置 PictureBox.SizeMode = AutoSize

然后在动画中 Timer.Tick 移动 PictureBox

这是一个小例子:

Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += timer_Tick;

// when the timer runs..
timer.Enabled = !timer.Enabled;

..它移动 PictureBox 左右:

void timer_Tick(object sender, EventArgs e)
{
    Point pt = new Point(pictureBox1.Left + offsetX, pictureBox1.Top + offsetY);
    pictureBox1.Location = pt;
}

请注意,该位置可以毫无问题地进入负数!

要使图像的初始位置居中,请使用:

pictureBox1.Location = new Point(-(pictureBox1.Width - Width)/2, 
                                 -(pictureBox1.Height - Height)/2);

要获得更好的动画支持,您可以考虑使用 WPF。