天天看點

EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox顯示圖檔連續重新整理出現閃爍問題 C# 在PictureBox 中繪圖防止閃爍的辦法

在上一篇裡,EmguCV(OpenCV)實作高效顯示漢字及疊加  實作了視訊疊加及顯示,但存在問題,就是 

Emgu.CV.UI.ImageBox及C# picturebox顯示圖檔時都會出現閃爍,尤其是圖檔的下方部分。

初步懷疑是電腦處理不過來,i3-3220 3.3Ghz 在1080p下cpu占用30%左右,480p下占用10%左右。480p下無閃爍現象。

一次把視訊顯示視窗調小,觀察很久未出現閃爍現象,于是懷疑是C# picturebox控件問題,Emgu.CV.UI.ImageBox也繼承了C# picturebox控件。

百度了一下  C# picturebox 閃爍  這些關鍵詞,發現很多相同問題。

大部分是要采用雙緩沖

this.DoubleBuffered = true;      

 或者複雜點

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

但是注意到picturebox沒有DoubleBuffered屬性,這裡都是修改的窗體form的DoubleBuffered屬性 ,并沒有什麼用。

還有各種複雜方法給picturebox加DoubleBuffered屬性的,還是沒啥用。

題外話,雙緩沖在sdl裡顯示效果還是比較好的。SDL_SetVideoMode()    SDL第一個程式:加載一張圖檔

這篇部落格也有詳細介紹:

C# 在PictureBox 中繪圖防止閃爍的辦法

 試了下,效率更低,閃爍更嚴重了。

 注意到這篇部落格裡有pictureBox1.Refresh();

于是嘗試了下,結果問題解決了。很簡單。

image.Bitmap = bmp;
imageBox.Image = image;
imageBox.Refresh();      

或者

pictureBox1.Image = bmp; 
pictureBox1.Refresh();      

 估計是設定圖檔後強制重新整理才真正顯示吧。

但是使用pictureBox顯示圖檔有問題,就是長時間不斷重新整理後會崩潰。測試大概12小時多後程式崩潰。

是以還是先用Emgu.CV.UI.ImageBox吧

還待繼續研究。