用C#繪製即時曲線圖

來源:互聯網
上載者:User

 在實際項目中我們經常需要繪製一些即時的資料圖片,比如當前各公司的用水量、用電量還有播放聲音視頻時即時顯示當前的聲頻等等,在我們最熟悉的工作管理員也有這麼一個功能,用來表示當前CPU的使用頻率,最近筆者剛剛給朋友完成了一個類似的功能圖,用曲線圖來即時表示一些實際資料,由於形象直觀,很受客戶歡迎。
不過由於某些原因,本人不能將實際項目中的代碼拿出來給大家分享,只能類比了一個簡單的實現,代碼沒有過多最佳化,所以還存在很多可以最佳化的地方,希望有興趣的朋友自己完善。

為了操作和應付變化,所以將繪製曲線圖的功能單獨封裝成一個類,裡面的資料完全是類比的,在橫向座標上每個像素間隔用一個點來控制(實際中可能會加大這個距離),橫向是個隨機產生的數(實際開發中這應該來自我們的即時資料按比率計算得來的),顯示表單中用到了一個線程來定時繪製即時曲線。

實際代碼如下:

using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Imaging;namespace RealtimeCurve{    ///     /// 說明:即時圖片產生類,在本例中橫向座標上每個像素都會有一個控制點    /// 實際開發中可以減少控制點,比如每5個像素用一個控制點    /// 這樣的效果或許更加逼真    /// 作者:周公    /// 日期:2008-07-21    /// 首發地址:http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx    ///     public class RealTimeImageMaker    {        private int width;//要產生的曲線圖的寬度        private int height;//要產生的曲線圖的高度        private Point[] pointList;//用來繪製曲線圖的關鍵點,依次將這些點串連起來即得到曲線圖        private Random random = new Random();//用於產生隨機數        private Bitmap currentImage;//當前要繪製的圖片        private Color backColor;//圖片背景色        private Color foreColor;//圖片前景色彩        ///         /// 圖片的高度        ///         public int Height        {            get { return height; }            set { height = value; }        }        ///         /// 圖片的寬度        ///         public int Width        {            get { return width; }            set { width = value; }        }        ///         /// 建構函式,指定產生的曲線圖的寬度和高度        ///         /// 要產生的曲線圖的寬度        /// 要產生的曲線圖的高度        public RealTimeImageMaker(int width, int height):this(width,height,Color.Gray,Color.Blue)        {                    }        ///         /// 建構函式,指定產生的曲線圖的寬度、高度及背景色和前景色彩        ///         /// 要產生的曲線圖的寬度        /// 要產生的曲線圖的高度        /// 曲線圖背景色        /// 曲線圖前景色彩        public RealTimeImageMaker(int width, int height, Color backColor, Color foreColor)        {            this.width = width;            this.height = height;            this.backColor = backColor;            this.foreColor = foreColor;            pointList = new Point[width];            Point tempPoint;            //初始化曲線上的所有點座標            for (int i = 0; i < width; i++)            {                tempPoint = new Point();                //曲線的橫座標沿x軸依次遞增,在橫向位置上每個像素都有一個點                tempPoint.X = i;                //曲線上每個點的縱座標隨機產生,但保證在顯示地區之內                tempPoint.Y = random.Next() % height;                pointList[i] = tempPoint;            }        }        ///         /// 擷取當前依次串連曲線上每個點繪製成的曲線        ///         ///         public Image GetCurrentCurve()        {            //currentImage = historyImage.Clone(new Rectangle(1, 0, width - 1, height), PixelFormat.Format24bppRgb);            currentImage = new Bitmap(width, height);            Point p;            //將當前定位曲線圖的座標點前移,並且將橫座標減1,            //這樣做的效果相當於移除當前第一個點            for (int i = 0; i < width-1; i++)            {                p = pointList[i + 1];                pointList[i] = new Point(p.X-1,p.Y);            }            Point tempPoint = new Point();            //新產生曲線圖錨點的最後一個點的座標            tempPoint.X = width;            //曲線上每個點的縱座標隨機產生,但保證在顯示地區之內            tempPoint.Y = random.Next(DateTime.Now.Millisecond) % height;            //在最後再添加一個新座標點            pointList[width-1]=tempPoint;            Graphics g = Graphics.FromImage(currentImage);            g.Clear(backColor);            //繪製曲線圖            g.DrawLines(new Pen(foreColor), pointList);            g.Dispose();            return currentImage;        }    }}

表單關鍵代碼:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Threading;namespace RealtimeCurve{    ///     /// 說明:顯示即時曲線圖的表單    /// 作者:周公    /// 日期:2008-07-21    /// 首發地址:http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx    ///     public partial class FormRealTime : Form    {        Thread thread;        RealTimeImageMaker rti;        Color backColor = Color.Black;//指定繪製曲線圖的背景色        public FormRealTime()        {            InitializeComponent();            rti = new RealTimeImageMaker(Width, Height, backColor, Color.Green);            thread = new Thread(new ThreadStart(Run));            thread.Start();        }        private void Run()        {            while (true)            {                Image image = rti.GetCurrentCurve();                Graphics g = CreateGraphics();                //用指定背景色清除當前表單上的圖象                g.Clear(backColor);                g.DrawImage(image, 0, 0);                g.Dispose();                //每秒鐘重新整理一次                Thread.Sleep(1000);            }        }        private void FormRealTime_FormClosing(object sender, FormClosingEventArgs e)        {            //在表單即將關閉之前中止線程            thread.Abort();        }    }}

程式最終的運行結果:

全部程式碼請到http://download.csdn.net/zhoufoxcn下載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.