众所周知,我们用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();
        }

解决方案 »

  1.   

    http://topic.csdn.net/u/20090703/22/afde5f12-3951-4f3c-a47d-6d9f32b6155d.html
      

  2.   

    先分析一下你的代码:
     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,这样不用释放        }改掉这些毛病再闪你来骂我
      

  3.   

    3楼给的链接正在看。
    按照4楼的方法修改过了,比如把bitmap初始化放在外面,去掉不必要的g1,使用e.Graphics。释放等等。但是,闪烁现象依旧,头疼啊。P.S.
    在网上很多朋友都会提到双缓冲技术,事实上我也都尝试过了,但不能解决问题!!
    我这里强烈建议各位新建一个窗体项目试试,花不到你一分钟!!!
    不管你用什么方法,如果能解决图像实时缩放闪烁现象。我真的对你佩服至极!!!
      

  4.   

    刚才发现pictureBox似乎可以解决问题。但是,不知道pictureBox如何载入已经分配的bitmap对象。
      

  5.   

    晕的,你按你原来的搞法Panel,不用PicBox,把全部代码贴上来我复制下试试
      

  6.   

    感谢几位兄台。问题解决了!!确实是要用PictureBox!
    万恶的panel啊, 为啥PictureBox就没问题呢?不知道哪位高人能解释一下。明天准时结贴。