使用gdi +进行无闪烁绘图

时间:2015-10-06 17:28:38

标签: c# drawing 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坐标会导致很多闪烁。

有没有人知道如何减少或消除闪烁?我已经研究了在屏幕上绘制位图并在完成绘图后加载它,我不知道如何做到这一点。

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

1 个答案:

答案 0 :(得分:0)

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。