众所周知,我们用windows照片查看器打开任意一副不是非常大的图片,如果我们随便拖动窗口大小,图片的大小也是会实时根据窗口大小改变的,注意是实时。现在,我也想用C#窗口程序实现类似的功能。我的程序很简单,在窗口上放置了一个panel,在这个panel里面显示。任意读取一幅不大的图片,然后将其显示,并编写窗体的Resize事件,代码如下。问题来了,随便什么图片,进行缩放的时候,闪烁现象都十分严重。而Windows照片查看器显示并缩放的时候基本上不会有任何闪烁。所以,请教一下如何才能解决这个问题???这个是panel1,paint事件代码。
private void panel1_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap("c:\\test.jpg");
Graphics g1 = Graphics.FromImage((System.Drawing.Image)bmp);
this.panel1.CreateGraphics().DrawImage(bmp, 0, 0, panel1.Width, panel1.Height); }
这个是窗口大小改变事件代码。
private void Form1_Resize(object sender, EventArgs e)
{
panel1.Width = this.Width;
panel1.Height = this.Height;
this.panel1.Invalidate();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap("c:\\test.jpg");
Graphics g1 = Graphics.FromImage((System.Drawing.Image)bmp);
this.panel1.CreateGraphics().DrawImage(bmp, 0, 0, panel1.Width, panel1.Height); }
这个是窗口大小改变事件代码。
private void Form1_Resize(object sender, EventArgs e)
{
panel1.Width = this.Width;
panel1.Height = this.Height;
this.panel1.Invalidate();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{//每次重绘时,要new一个图像出来,而重绘事件是时常发生的,那多影响效率啊
Bitmap bmp = new Bitmap("c:\\test.jpg");
Graphics g1 = Graphics.FromImage((System.Drawing.Image)bmp);
//上面这个g1完全是多余的
this.panel1.CreateGraphics().DrawImage(bmp, 0, 0, panel1.Width, panel1.Height);//CreateGraphics()出来的g一定要用Dispose()释放资源
正确的方法是使用参数里的Graphics对象:Graphics g = e.Graphics,这样不用释放 }改掉这些毛病再闪你来骂我
按照4楼的方法修改过了,比如把bitmap初始化放在外面,去掉不必要的g1,使用e.Graphics。释放等等。但是,闪烁现象依旧,头疼啊。P.S.
在网上很多朋友都会提到双缓冲技术,事实上我也都尝试过了,但不能解决问题!!
我这里强烈建议各位新建一个窗体项目试试,花不到你一分钟!!!
不管你用什么方法,如果能解决图像实时缩放闪烁现象。我真的对你佩服至极!!!
万恶的panel啊, 为啥PictureBox就没问题呢?不知道哪位高人能解释一下。明天准时结贴。