日期:2014-05-20  浏览次数:20679 次

谁能给一个用双缓冲播放一个文件夹下的图片的程序
谢谢。

------解决方案--------------------
到网上搜双缓冲,都会搜到两段被无数人转载的双缓冲的代码,但是由于其解释不是很详细,造成了阅读的困难,尤其是对于GDI的新手来说。于是,我将该代码研究了一下,写一个稍微详细的注释,仅供参考。

在构造函数里添加

this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

依然是写在 override OnPaint里


protected override void OnPaint(PaintEventArgs e)//双缓冲画图
{

Image i= new Bitmap(Image.FromFile("sample.png"));//建立一个画布

Graphics g = Graphics.FromImage(i);//把画布加载到画刷里

Rectangle rect = e.ClipRectangle;//当前Form的大小矩形
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;//创建图形缓冲区
BufferedGraphics myBuffer = currentContext.Allocate(g, e.ClipRectangle);//为双缓冲提供图形缓冲区
myBuffer.Graphics.SmoothingMode = SmoothingMode.HighQuality;
myBuffer.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed;
myBuffer.Graphics.Clear(this.BackColor);

Rectangle Pic = new Rectangle(StartPosition.X, StartPosition.Y, Width, Height);//你想在Form里画出图形的其实位置,长何宽
myBuffer.Graphics.DrawImage(i, rect , Pic, GraphicsUnit.Pixel);//在内存里画图

e.Graphics.DrawImage(i, Back);//画到Form中
myBuffer.Render(e.Graphics);
myBuffer.Dispose();
g.Dispose();
base.OnPaint(e);

}

好了,如果对注释还不是很清楚的话,可以修改Rectangle 的参数进行深刻体会

另外顺便说一下Graphics,Image,Bitmap之间的关系:

Bitmap是创建一张图片,Image是将Bitmap所创建的图片加载到画布上,Graphics是在Image上进行画图

如果图片要不停刷新的画,双缓冲的优势是比较大的,顾名思义,双缓冲就是把要画的图片先在内存中一次画好,然后整体画到Form中。而不用双缓冲的话,则是每在图片上处理一次,Form都要刷新一次,这样执行起来浪费资源,效率降低。

------解决方案--------------------
帮忙顶下~~