2015-10-06 96 views
0

我有一个.png文件,我想绘制,问题是,我正在绘制这个PNG每秒的1/10,所以这是每秒10次。这个png是用X和Y坐标作为中间点绘制的,所以图像的中间是X和Y坐标。使用gdi + flickerfree绘图+

使用此代码:

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坐标在闪烁的很多结果。

有没有人有任何想法如何减少或消除闪烁?我已经考虑绘制位图关闭屏幕,并加载它一旦完成绘图,我不知道如何做到这一点。

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

+0

看起来像你正在绘制到窗体上。它有一个属性'DoubleBuffered',这是第一步。但不要太希望;使用Winforms的动画是相当有限的.. – TaW

+3

此外,你正在重新加载位图上的每个绘画迭代。这超出了浪费。只做一次。 – Rotem

+0

@TaW你会推荐使用什么动画?因为我只是在新的位置重新绘制PNG,但重画的问题是屏幕变白,整个PNG被重绘。它不一定是流畅的动画,它可以是矮胖的,但不会闪烁太多 – BramSnoek

回答

0

Winforms绝对不适合动画。

这里有一个建议,你可能会或可能找不到足够好:

负载大ImagePictureBox.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。

+0

即时通讯在这个东西atm,所以这个问题可能听起来真的很愚蠢,但你是什么意思与offsetX和offsetY – BramSnoek

+0

,因为我知道你在做什么,但我需要给(已知)X和Y坐标,需要是图片盒的起点正在移动,甚至更好的图片框 – BramSnoek

+0

你想要移动图像的中间点,对吧?所以你需要改变它的位置一些金额。这就是两个变量的作用。你可以像这样计算初始位置的中心位置pb.left = - (pb.width - form.width)/ 2; – TaW