最近初学GDI+,画图时发现一个问题,暂时不知道如何去查资料,也没有头绪,问题现象如下:
Form中有一PictureBox控件,在PictureBox控件的Onpaint事件里画图,代码摘要如下:
1 //画背景图 2 var img = File.Exists(path) ? Image.FromFile(path) : new Bitmap(this.pb.Width, this.pb.Height); 3 var gh = Graphics.FromImage(img); 4 5 .... 6 7 //画些其它的小图片 8 // gh.DrawImage(devImage, devImageRec, descRec, GraphicsUnit.Pixel); //这里很奇怪,devImageRec其实是图片的尺寸,但是画出来却变得很小,而devImageRec是正常的,只是图片变小 9 gh.DrawImageUnscaled(devImage, dev.X, dev.Y); 10 11 ... 12 13 //存图片 14 using ( 15 var fs = new FileStream( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Region", fileName), 16 FileMode.OpenOrCreate, 17 FileAccess.ReadWrite, 18 FileShare.ReadWrite)) 19 { 20 fs.Position = 0; 21 fs.Write(buffer, 0, buffer.Length); 22 fs.SetLength(buffer.Length); 23 fs.Flush(); 24 25 regionEntity.ExtendField1 = fileName; 26 } 27 28 ... 29 30 //将图片画到PictureBox画板上 31 var pbGh = pb.CreateGraphics(); 32 pbGh.Clear(Color.White); 33 pbGh.DrawImage(img, new Point(0, 0)); 34 35 //资源释放 36 pbGh.Dispose(); 37 gh.Dispose(); 38 img.Dispose();
当Form被其它窗体遮盖,或者窗体失去焦点,或者最大化、最小化后,PictureBox上的图像就消失了。在这个过程中,能看到有时图像一闪而过,只不过最后看到的是没有图像。
图片闪烁比较严重,图片已作加载到缓存处理
/// <summary> /// 加载图片的内存缓存 /// </summary> private Dictionary<String, Image> imgMemoryCache = new Dictionary<string, Image>();
Key是图片的路径
Value 是图片加载后的Image对象
请有经验的师父指点,豆不多,全部奉上。
闪烁情况也比较严重
不要这么整,在内存里把图片画好之后,直接显示到PictureBox就行了。
你把img设置成全局的试试,这样应该能起到双缓冲的作用,这个img你只要初始化的时候new一下就好了,不要每次执行的时候都重新new,
当然,在方法执行完后也不要dispose